我正在尝试做一个简单的多处理示例。我试图在多处理线程池中运行一个简单的shell脚本。脚本正在执行,但脚本的输出未正确返回到调用函数。
def call_proc(cmd):
p = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
print "Out" +out
print "Error" +err
return (out, err)
if __name__ == "__main__":
pool = ThreadPool(multiprocessing.cpu_count())
results = []
for i in range(1,5):
results.append(pool.apply_async(call_proc ("./test.sh")))
# Close the pool and wait for each running task to complete
pool.close()
pool.join()
print results
for result in results:
out, err = result.get()
print("out: {} err: {}".format(out, err))
当我运行python脚本
时,我得到以下输出以及异常输出:测试完成
错误:
输出:测试完成
错误:
输出:测试完成
错误:
输出:测试完成
错误:
回溯 (最近一次调用最后一次):文件" osshm_multiprocess.py",第25行,in out,err = result.get()File" /usr/lib64/python2.6/multiprocessing/pool.py" ;, line 422,in get raise self._value TypeError:' tuple'对象不可调用
不确定哪里出错了。
答案 0 :(得分:1)
至于我,你忘记了,
和call_proc
之间的逗号("./test.sh")
现在执行call_proc("./test.sh")
,其结果使用apply_async
参数
你做这样的事情
function_result = call_proc("./test.sh")
pool.apply_async(function_result)
但你必须这样做
function_name = call_proc
function_args = ("./test.sh", ) # tuple with arguments
pool.apply_async(function_name, function_args) # <-- comma between name and args
所以你需要
pool.apply_async(call_proc, ("./test.sh",))
答案 1 :(得分:0)
似乎你已经从
获得了一个元组out, err = result.get()
删除对get()
的调用