【发布时间】: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