2016-04-01 44 views
0

我正在学习如何使用子过程,为此(和其他一些原因) 我买了一本书来学习如何使用子过程。这本好书 我不会理解它。在我的书中,他们开始解释如何在子进程中执行shell命令。 如何在python中执行funcion回调作为子进程?

我有一个编程问题,我的年龄,并与子流程,我可以 能够解决它我需要执行一个回调函数作为子进程。

我有这样的代码呼应的东西,但它是一个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 

奇怪的是,它不执行回调,但随后引发这个错误! 我做错了什么?我忘了什么吗?

+1

函数被调用,默认返回None,所以你基本上调用'subprocess.Popen(None)' –

+0

那么我怎样才能避免错误? –

+0

这实际上取决于你想要做什么,有可能更简单的方法来做你想做的。回调逻辑背后的想法是什么? –

回答

1

subprocess模块不适合执行python回调。你想看看multiprocessing module。前几个例子ProcessPool似乎做你想做的。

相关问题