题
我运行的电脑安装在静音模式和缓存记录的具体文件。以下是命令我需要执行。
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%
直接未来的计划!
有2种方式来解决这个问题:
叫外壳。
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]
其他提示
的问题是,您有效提供的Setup.exe只有一个参数。不要以为在外壳方面,你交出作为参数没有得到空间上分裂了的弦,那是你的义务!
所以,如果你是绝对肯定 “/ 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]
否则(我想这一个将是正确的),使用:
subprocess.Popen(['C:\Program Files\ My Installer\Setup.exe', '/s', '/v', '/qn', '/lv', '%TEMP%\log_silent.log'],stdout=subprocess.PIPE).communicate()[0]
尝试把每个参数在它自己的串(重新格式化为可读性):
cmd = ['C:\Program Files\ My Installer\Setup.exe',
'/s',
'/v',
'"/qn',
'/lv',
'%TEMP%\log_silent.log"']
subprocess.Popen(cmd, 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]
时的目录名真正的“我的安装程序”(用前导空格)?
此外,作为一般规则,你应该在路径规范使用正斜杠。蟒蛇应该无缝地处理他们(甚至在Windows上)和你避免与蟒蛇解释反斜杠作为转义字符的任何问题。
(例如:
>>> s = 'c:\program files\norton antivirus'
>>> print s
c:\program files
orton antivirus
)
不隶属于 StackOverflow