Python 子进程.Popen错误
我正在静默模式下运行msi安装程序,并在特定文件中缓存日志。下面是我需要执行的命令Python 子进程.Popen错误,python,subprocess,popen,Python,Subprocess,Popen,我正在静默模式下运行msi安装程序,并在特定文件中缓存日志。下面是我需要执行的命令 C:\Program Files\My Installer\Setup.exe/s/v”/qn/lv%TEMP%\log\u silent.log“ 我用过: subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).c
C:\Program Files\My Installer\Setup.exe/s/v”/qn/lv%TEMP%\log\u silent.log“
我用过:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]
执行该命令,但它无法识别该操作,并给出有关所选错误选项的错误信息。我已经交叉验证,发现该命令仅以这种方式工作。问题在于,您实际上只提供了一个Setup.exe参数。不要从shell的角度考虑,作为参数传递的字符串不再在空格上拆分,这是你的职责 因此,如果您完全确定“/qn/lv%TEMP%\log\u silent.log”应该是一个参数,那么请使用以下参数:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn /lv %TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
否则(我想这是正确的),请使用以下命令:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn /lv %TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
尝试将每个参数放入自己的字符串中(为可读性重新格式化):
但是我不得不说,那些双引号在我看来并不合适。问题很微妙 您正在直接执行程序。它得到:
argv[0] = "C:\Program Files\ My Installer\Setup.exe"
argv[1] = /s /v "/qn /lv %TEMP%\log_silent.log"
鉴于它应该是:
argv[1] = "/s"
argv[2] = "/v"
argv[3] = "/qn"
argv[4] = "/lv %TEMP%\log_silent.log"
换句话说,它应该接收5个参数,而不是2个参数
另外,%TEMP%
程序直接未知
有两种方法可以解决此问题:
p = subprocess.Popen('C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"', shell=True)
output = p.communicate()[0]
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'],stdout=subprocess.PIPE).communicate()[0]
目录名真的是“我的安装程序”(带前导空格)
此外,作为一般规则,您应该在路径规范中使用前斜杠。Python应该无缝地处理它们(即使在Windows上),并且您可以避免Python将反斜杠解释为转义字符的任何问题
(例如:
>>> s = 'c:\program files\norton antivirus'
>>> print s
c:\program files
orton antivirus
)另外,“C:\Program Files\My Installer\Setup.exe”应为r“C:\Program Files\My Installer\Setup.exe”。需要将“”加倍,或者字符串必须是一个r“”字符串。帮助使用空格分隔的每个参数。需要使用引号。不知道为什么。即使开关v重复。如果你的代码在路径中有一个前导空格,那就是一个明显的错误源。