2016-04-01 62 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似乎做你想做的。

相關問題