Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 子进程.Popen错误_Python_Subprocess_Popen - Fatal编程技术网

Python 子进程.Popen错误

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

我正在静默模式下运行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).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%
程序直接未知

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

  • 调用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]
    
  • 直接呼叫程序(更安全)

  • 你说:

    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重复。如果你的代码在路径中有一个前导空格,那就是一个明显的错误源。