麻烦subprocess.check_输出()

2024-05-04 18:50:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我在使用subprocess.check_output()时遇到一些奇怪的问题。一开始我只使用subprocess.call(),一切正常。然而,当我简单地将call()换成{}时,我收到一个奇怪的错误。在

代码之前(工作正常):

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

代码后(无效):

^{pr2}$

这会产生错误: Error

我不能重定向,因为程序挂在这里,我不能按ctrl-c键退出。你知道为什么会这样吗?有什么区别subprocess.call()并检查可能导致此问题的输出()?在

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

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()

谢谢!在


Tags: the代码inhostforoutputexecutecheck
1条回答
网友
1楼 · 发布于 2024-05-04 18:50:32

你遇到了Python Issue 9400。在

关于subprocess.call()subprocess.check_output()之间有一个关键的区别。subprocess.call()将执行您给它的命令,然后向您提供返回代码。另一方面,subprocess.check_output()以字符串的形式返回程序的输出,但它会帮你一个忙,检查程序的返回代码,如果程序没有成功执行(返回非零返回代码),则将引发异常subprocess.CalledProcessError)。在

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

您正在调用的程序返回一个非零返回代码,这使得subprocess.check_output()引发异常,pool.map()无法正确处理它,因此您得到了检索异常失败的TypeError。在

顺便说一句,subprocess.CalledProcessError的定义一定是搞砸了,因为如果我打开我的2.7.6终端,导入子进程,并手动提出错误,我仍然得到TypeError,所以我不认为这仅仅是一个酸洗问题。在

相关问题 更多 >