返回

在 GitHub Actions 中使用 subprocess.run 执行 Pytest 命令的参数无效问题

Linux

subprocess.run 在 GitHub Actions 中对 Pytest 命令执行不当

问题

使用 subprocess.run 在 GitHub Actions 工作流中执行 pytest 命令时,命令行参数不起作用。这导致在远程工作流中运行的测试与在本地运行的测试产生不同的结果。

问题分析

subprocess.run 使用 subprocess.Popen 函数来运行外部命令。subprocess.Popen 有一个 shell 参数,它指定是否使用系统 shell 来执行命令。

在默认情况下,shell 参数设置为 True。这会导致 pytest 命令在系统 shell 中执行。在系统 shell 中,-m 参数不起作用,因为它只被 Python 解释器识别。

解决方案

要解决这个问题,需要将 shell 参数设置为 False。这将阻止使用系统 shell,并允许 pytest 命令正确解释 -m 参数。

以下是如何修改 run_tests.py 脚本:

import subprocess

if __name__ == "__main__":
    cmd = ['pytest', '-m', 'sum']
    subprocess.Popen(cmd, text=True, shell=False)

结论

shell 参数设置为 False 可以解决在 GitHub Actions 工作流中使用 subprocess.run 运行 pytest 命令时出现的参数无效问题。这将确保命令行参数按预期工作,并且在远程工作流中运行的测试与在本地运行的测试产生相同的结果。

常见问题解答

  1. 为什么在系统 shell 中 -m 参数不起作用?

    • -m 参数只被 Python 解释器识别。在系统 shell 中,该参数不会被解释器识别,因此不起作用。
  2. shell 参数设置为 TrueFalse 有什么区别?

    • shell 参数设置为 True 会导致外部命令在系统 shell 中执行,而设置为 False 会阻止使用系统 shell。
  3. 为什么在 GitHub Actions 工作流中需要将 shell 参数设置为 False

    • 在 GitHub Actions 工作流中,默认情况下不使用系统 shell 来执行命令。因此,需要将 shell 参数设置为 False,以便 pytest 命令能够正确解释命令行参数。
  4. 除了解决 -m 参数的问题外,将 shell 参数设置为 False 还有什么好处?

    • shell 参数设置为 False 可以提高安全性,因为它可以防止外部命令访问系统环境变量和 shell 函数。
  5. 在哪些其他情况下需要将 shell 参数设置为 False

    • 在需要控制外部命令执行环境或需要提高安全性的情况下,需要将 shell 参数设置为 False