【问题标题】:How to execute a funcion callback as subprocess in python?如何在python中将函数回调作为子进程执行?
【发布时间】:2016-07-21 19:57:08
【问题描述】:

出于这个(和其他一些)原因,我目前正在学习如何使用子流程 我买了一本书来学习如何使用子流程。这是一本好书 而且我没有理解它的麻烦。在我的书中,他们开始解释 如何将 shell 命令作为子进程执行。

我有一个多年来一直存在的编程问题,通过子流程,我可以 能够解决它但是我需要执行一个函数回调作为子进程。

我有这段代码来回显某些东西,但它是一个 shell 命令:

import subprocess

proc = subprocess.Popen(['echo', 'Hello, this is child process speaking'],
            stdout=subprocess.PIPE, shell=True)
out, err = proc.communicate()
print(out.decode('utf-8'))

我希望这个回调作为子进程执行:

def callb()
import time as t
print('2')
t.sleep(2)
    print('1')
t.sleep(2)
    print('0')

我只是尝试像这样执行这个回调(这是一个简单天真的想法):

proc = subprocess.Popen(callb())

但这给了我以下错误:

Traceback (most recent call last):
  File "/root/testfile.py", line 6, in <module>
    proc = subprocess.Popen(callb())
  File "/usr/lib/python3.3/subprocess.py", line 818, in __init__
    restore_signals, start_new_session)
  File "/usr/lib/python3.3/subprocess.py", line 1321, in _execute_child
    args = list(args)
TypeError: 'NoneType' object is not iterable

奇怪的是,它确实执行了回调,但是却引发了这个错误! 我做错了什么?我是不是忘记了什么?

【问题讨论】:

  • 函数被调用并默认返回 None 所以你基本上是在调用subprocess.Popen(None)
  • 那我怎样才能避免这个错误呢?
  • 这真的取决于你想做什么,可能有更简单的方法来做你想做的事。回调逻辑背后的思想是什么?
  • 我需要做一些复杂且耗时的计算,我希望它们同时完成,这样更快
  • 那么您可能想要带有池 docs.python.org/3/library/multiprocessing.html 的多处理库,这也取决于您正在做的工作类型

标签: python shell python-3.x callback subprocess


【解决方案1】:

subprocess 模块不适合执行 python 回调。你想看看multiprocessing moduleProcessPool 的前几个示例似乎可以满足您的要求。

【讨论】:

    猜你喜欢
    • 2021-02-02
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 2019-09-06
    相关资源
    最近更新 更多