【问题标题】:Issue with value returned by python functionpython函数返回值的问题
【发布时间】:2017-01-09 07:31:04
【问题描述】:

我正在尝试做一个简单的多处理示例。我试图在多处理线程池中运行一个简单的 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 行,在 out, err = result.get() 文件“/usr/lib64/python2.6/multiprocessing/pool.py”,第 422 行,在 get raise self._value TypeError: 'tuple' object is not callable

不知道哪里出错了。

【问题讨论】:

  • 你忘记了call_proc("./test.sh") 之间的逗号 - 现在你执行call_proc("./test.sh") 并且它的结果被使用了apply_async 参数。

标签: python subprocess multiprocessing


【解决方案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",))

【讨论】:

    【解决方案2】:

    似乎你已经从

    获得了一个元组
    out, err = result.get()
    

    删除对get()的调用

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2016-01-08
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-03
      • 2011-03-06
      相关资源
      最近更新 更多