subprocess.Popen错误

kin*_*pin 3 python subprocess popen

我在静默模式下运行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]
Run Code Online (Sandbox Code Playgroud)

执行命令然而它无法识别操作并且在选择错误选项时给出错误.我已经交叉验证,发现命令只能这样工作.

kyl*_*oks 8

问题非常微妙.

你正在直接执行该程序.它得到:

argv[0] = "C:\Program Files\ My Installer\Setup.exe"
argv[1] = /s /v "/qn /lv %TEMP%\log_silent.log"
Run Code Online (Sandbox Code Playgroud)

它应该是:

argv[1] = "/s"
argv[2] = "/v"
argv[3] = "/qn"
argv[4] = "/lv %TEMP%\log_silent.log"
Run Code Online (Sandbox Code Playgroud)

换句话说,它应该接收5个参数,而不是2个参数.

此外,%TEMP%程序直接未知!

有两种方法可以解决此问题:

  1. 调用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]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 直接打电话给程序(更安全)

    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]
    
    Run Code Online (Sandbox Code Playgroud)