在 GitHub Actions 中使用 subprocess.run 执行 Pytest 命令的参数无效问题
2024-03-29 03:43:58
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
命令时出现的参数无效问题。这将确保命令行参数按预期工作,并且在远程工作流中运行的测试与在本地运行的测试产生相同的结果。
常见问题解答
-
为什么在系统 shell 中
-m
参数不起作用?-m
参数只被 Python 解释器识别。在系统 shell 中,该参数不会被解释器识别,因此不起作用。
-
shell
参数设置为True
和False
有什么区别?shell
参数设置为True
会导致外部命令在系统 shell 中执行,而设置为False
会阻止使用系统 shell。
-
为什么在 GitHub Actions 工作流中需要将
shell
参数设置为False
?- 在 GitHub Actions 工作流中,默认情况下不使用系统 shell 来执行命令。因此,需要将
shell
参数设置为False
,以便pytest
命令能够正确解释命令行参数。
- 在 GitHub Actions 工作流中,默认情况下不使用系统 shell 来执行命令。因此,需要将
-
除了解决
-m
参数的问题外,将shell
参数设置为False
还有什么好处?- 将
shell
参数设置为False
可以提高安全性,因为它可以防止外部命令访问系统环境变量和 shell 函数。
- 将
-
在哪些其他情况下需要将
shell
参数设置为False
?- 在需要控制外部命令执行环境或需要提高安全性的情况下,需要将
shell
参数设置为False
。
- 在需要控制外部命令执行环境或需要提高安全性的情况下,需要将