【发布时间】:2020-06-22 15:38:30
【问题描述】:
我正在尝试将 subprocess.run 与自定义参数一起使用,该参数可直接从 windows cmd 和 subprocess.call 使用,但不适用于 subprocess.run,正如 Running shell command and capturing the output 所建议的那样。
这行得通:
retcode = subprocess.call(build_command_line, shell=True)
这失败了:
result = subprocess.run([build_command_line], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
和输出
The filename, directory name, or volume label syntax is incorrect.
Traceback (most recent call last):
File "C:\Program Files\Python37\lib\subprocess.py", line 800, in __init__
restore_signals, start_new_session)
File "C:\Program Files\Python37\lib\subprocess.py", line 1207, in _execute_child
startupinfo)
File "C:\Program Files\JetBrains\PyCharm 2020.1.1\plugins\python\helpers\pydev\_pydev_bundle\pydev_monkey.py", line 551, in new_CreateProcess
return getattr(_subprocess, original_name)(app_name, patch_arg_str_win(cmd_line), *args)
PermissionError: [WinError 5] Access is denied
即使我以管理员身份运行。
这并不重要,但为了完整性:
build_command_line 是:
'"C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\MSBuild.exe" "C:\\code\\EPMD\\Kodex\\Solutions\\Kodex.All.sln" /t:REBUILD /p:Configuration=RELEASE'
如何让它与subprocess.run 一起使用?
【问题讨论】:
-
build_command 行是一个字符串(然后你传递一个带有单个字符串的列表)或者它是一个列表(然后你传递一个带有单个元素的列表,这是一个列表),请澄清 build_c 命令行的内容,不能从你写的内容中得到它是什么
-
@E.Serra 已编辑。它是一个字符串。所以我应该打电话没有
[]? -
[build_command_line]是错误的。只需使用build_command_line。在 Windows 中,您始终可以使用命令行字符串。如果您传递args列表而不是命令行,subprocess.Popen使用subprocess.list2cmdline根据 MSVC 和 WinAPICommandLineToArgvW使用的规则构建命令行。使用[build_command_line],整个命令行是列表中的一项,因此所有引号都被转义为文字字符。 -
shell=True 允许您将任何命令编写为字符串,通常的调用方法是将参数和值作为元素的列表传递给它,例如['ls', '-a', '-l'],把你的命令分解成一个真正的列表,然后试一试
-
@E.Serra,它是 Windows,所以传递命令行字符串不需要
shell=True。如果脚本需要支持 Unix,那么在这种情况下它应该使用 args 列表。
标签: python windows cmd msbuild subprocess