Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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 subprocess.checkoutput称为进程错误_Python_Subprocess_Popen - Fatal编程技术网

Python subprocess.checkoutput称为进程错误

Python subprocess.checkoutput称为进程错误,python,subprocess,popen,Python,Subprocess,Popen,在windows命令行中,我输入以下命令以启用windows功能: >dism.exe -online -Enable-Feature -FeatureName:MSMQ-HTTP 此命令工作正常,并启用MSMQ-HTTP功能。现在我正在编写一个Python脚本来自动化这个过程,我的代码 subprocess.check_output(['dism.exe', '-online', '-Enable-Feature', '-FeatureName:MSMQ-HTTP'], shell=T

在windows命令行中,我输入以下命令以启用windows功能:

>dism.exe -online -Enable-Feature -FeatureName:MSMQ-HTTP
此命令工作正常,并启用MSMQ-HTTP功能。现在我正在编写一个Python脚本来自动化这个过程,我的代码

subprocess.check_output(['dism.exe', '-online', '-Enable-Feature', '-FeatureName:MSMQ-HTTP'], shell=True)
返回严重错误,CalledProcessError:Command“['dism.exe'、'-online'、'-Enable Feature'、'-FeatureName:MSMQ-HTTP']”返回非零退出状态11


有人能解释一下为什么这不起作用吗?

Python的子流程模块和DISM.exe存在一些比特问题。即使在指定C:\Windows\system32\dism.exe绝对路径时,我也得到了错误代码11

我最终的解决方案是编写一个10行批处理文件:

@echo off
if EXIST %WINDIR%\system32\dism.exe ( 
  set DISM=%WINDIR%\system32\dism.exe 
) 
if EXIST %WINDIR%\SysNative\dism.exe ( 
  set DISM=%WINDIR%\SysNative\dism.exe 
)
%DISM% -online -Enable-Feature -FeatureName:MSMQ-ADIntegration
%DISM% -online -Enable-Feature -FeatureName:MSMQ-HTTP
%DISM% -online -Enable-Feature -FeatureName:MSMQ-Triggers
这个小批处理文件是通过子流程从我的Python脚本调用的:

def MSMQ():
    p = subprocess.Popen(r"PrereqInstall\SetMSMQFeatures.bat", shell=True)
    stout, stderr = p.communicate()

如果我要使用
shell=True
,我通常不会传递列表,但我不知道这些东西在Windows上是如何工作的……另外,当从命令行调用时,您能否验证程序的退出代码是否为
0
?我尝试了shell=False并删除了该参数,是的,我刚刚使用echo%ERRORLEVEL%@mgilson:在Windows上验证了退出代码为0,这就是它在有和没有
shell=True
的情况下的工作方式。当涉及到引号时,很容易出错,但我认为这并不重要。首先,为什么要使用
-
参数而不是
/
参数?文档和我能找到的每个教程都使用
/
。(这不太可能是问题所在,但有些程序会检查父级是否为cmd.exe,或者更一般地说,它是一个控制台程序,并以不同方式处理参数。)