python函数返回值的问题

时间:2017-01-09 07:31:05

标签: python subprocess multiprocessing

我正在尝试做一个简单的多处理示例。我试图在多处理线程池中运行一个简单的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'对象不可调用

不确定哪里出错了。

2 个答案:

答案 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()的调用