subprocess.check_output()的问题

时间:2014-08-21 21:02:48

标签: python subprocess

我使用subprocess.check_output()时遇到了一些奇怪的问题。起初我只是使用subprocess.call(),一切正常。但是,当我只为call()切换check_output()时,我收到一个奇怪的错误。

在代码之前(工作正常):

def execute(hosts):
''' Using psexec, execute the batch script on the list of hosts '''
successes = []
wd = r'c:\\'
file = r'c:\\script.exe'
for host in hosts:
    res = subprocess.call(shlex.split(r'psexec \\\\%s -e -s -d -w %s %s' % (host,wd,file)))
    if res.... # Want to check the output here
        successes.append(host)
    return successes

代码之后(没有工作):

def execute(hosts):
''' Using psexec, execute the batch script on the list of hosts '''
successes = []
wd = r'c:\\'
file = r'c:\\script.exe'
for host in hosts:
    res = subprocess.check_output(shlex.split(r'psexec \\\\%s -e -s -d -w %s %s' % (host,wd,file)))
    if res.... # Want to check the output here
    successes.append(host)
return successes

这给出了错误: Error

我无法重定向,因为程序在这里挂起,我无法控制出来。任何想法为什么会这样? subprocess.call()和check_output()之间可能导致这种情况的区别是什么?

以下是包含多处理部分的附加代码:

PROCESSES = 2
host_sublists_execute = [.... list of hosts ... ]
poolE = multiprocessing.Pool(processes=PROCESSES)
success_executions = poolE.map(execute,host_sublists_execute)
success_executions = [entry for sub in success_executions for entry in sub]
poolE.close()
poolE.join()

谢谢!

1 个答案:

答案 0 :(得分:3)

您遇到Python Issue 9400

关于subprocess.call() vs subprocess.check_output(),您必须了解一个关键区别。 subprocess.call()将执行您提供的命令,然后为您提供返回代码。另一方面,subprocess.check_output()将字符串中的程序输出返回给您,但是它会尝试帮助您并检查程序的返回代码并且将引发异常({{1如果程序没有成功执行(返回非零返回码)。

当您使用多处理池调用subprocess.CalledProcessError时,它会尝试将子进程中的异常传播回main并在那里引发异常。显然,如何定义pool.map()异常类存在问题,因此当多处理库尝试将异常传播回main时,修补失败。

您正在调用的程序返回非零返回码,这会导致subprocess.CalledProcessError引发异常,而subprocess.check_output()无法正确处理它,因此您获得了{{1}这是因为尝试检索异常失败导致的。

作为旁注,pool.map()的定义必须搞砸,因为如果我打开我的2.7.6终端,导入子进程,并手动提出错误,我仍然得到TypeError所以我认为这不仅仅是一个酸洗问题。