我使用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
这给出了错误:
我无法重定向,因为程序在这里挂起,我无法控制出来。任何想法为什么会这样? 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()
谢谢!
答案 0 :(得分:3)
关于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
所以我认为这不仅仅是一个酸洗问题。