我在静默模式下运行msi安装程序并在特定文件中缓存日志.以下是我需要执行的命令.
C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"
我用了:
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%
程序直接未知!
有两种方法可以解决此问题:
调用shell.
p = subprocess.Popen('C:\Program Files\ My Installer\Setup.exe /s /v "/qn /lv %TEMP%\log_silent.log"', shell=True) output = p.communicate()[0]
直接打电话给程序(更安全)
s = ['C:\Program Files\ My Installer\Setup.exe', '/s /v "/qn /lv %TEMP%\log_silent.log"'] safes = [os.path.expandvars(p) for p in argument_string] p = subprocess.Popen(safes[0], safes[1:]) output = p.communicate()[0]