在GitLab CI中,使用Python的`subprocess.run()`返回意外的空stdout

90次阅读
没有评论

问题描述

在使用GitLab CI时,遇到了一个问题。他的Python黑盒测试套件在个人机器上通过pipenv run pytest命令运行时一切正常,但在使用相同版本的Docker镜像运行时,调用subprocess.run(command, shell=True, capture_output=True, text=True)返回了一个带有意外空stdout和stderr值的CompletedProcess对象。除了测试失败的空输出之外,没有出现其他错误。用户想知道在CI运行器上收集子进程输出是否有一些要求,他是否遗漏了什么要求。他认为如果子进程本身失败,他应该至少在stderr中得到一些内容,或者返回代码应该是非零,但事实并非如此。
以下是相关的失败信息:

def test_help():
    """test running <command>'s `help` option, and the command on various subcommands"""
    out = run_command_subprocess(None, "-h")
    assert out.stderr == ""
    assert out.stdout.startswith("usage: <command>")

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在GitLab CI中,可能会出现一些与子进程输出收集相关的问题。以下是一些可能导致你遇到的问题的原因和解决方案:
1. 缺少输出捕获标志:在调用subprocess.run()时,确保设置capture_output=True,以便捕获子进程的stdout和stderr输出。这样,你才能在返回的CompletedProcess对象中访问这些输出。
2. 文本模式问题:在调用subprocess.run()时,确保设置text=True,以便将子进程的输出作为文本字符串返回。如果不设置这个标志,输出将作为字节字符串返回。
3. shell模式问题:在调用subprocess.run()时,如果你使用了shell=True,请确保你的命令在shell中正确执行。有时候,命令可能需要在shell中执行才能正常工作,但这也可能导致一些问题。如果可能的话,尝试将shell=True改为shell=False,并将命令作为列表传递给subprocess.run()
4. 环境变量问题:在GitLab CI中,可能会有一些环境变量的差异,这可能会影响子进程的执行。确保你的CI环境中的环境变量与你的个人机器上的环境变量一致,或者在CI配置中显式设置所需的环境变量。
5. 其他问题:如果以上解决方案都没有解决你的问题,可能还有其他原因导致子进程的输出为空。你可以尝试在CI运行器上手动运行相同的命令,以查看是否有任何错误或输出问题。

希望以上解决方案能帮助你解决问题。如果问题仍然存在,请提供更多详细信息,以便我们能够更好地帮助你解决问题。

正文完