2016-04-01 17 views
0

Şu anda, alt işlemlerin nasıl kullanılacağını öğrenmek için bir kitap satın aldığım (ve diğer bazı nedenlerden dolayı), bu (ve diğer bazı nedenlerden dolayı) alt işlemlerin nasıl kullanılacağını öğreniyorum. Bu iyi bir kitap ve bunu anlamakta zorluk çekmiyorum. Kitabımda, açıklamasını, alt işlem olarak kabuk komutlarını nasıl çalıştırdıklarını açıklamaya başlıyorlar. Python'da alt işlem olarak funcion geri çağırma nasıl yürütülür?

ben yaş için olan bir programlama problemi vardı ve ama Ben alt işlemi olarak bir geri çağırma işlevi yürütmek için gereken subprocesses ile, ben bunu çözmek mümkün olabilir.

şey yankı için bu kodu var ama bir kabuk komutu var: Sadece bu geri arama yürütmek için denedik

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

:

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')) 

Bu geri arama alt süreç olarak yürütülecek istiyorum (Bu basit bir naif fikirdi):

proc = subprocess.Popen(callb()) 

ama bu bana aşağıdaki hatayı veriyor:

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 

garip şey geri arama yürütmek olmadığını, ancak o zaman bu hatayı yükseltir! Neyi yanlış yaptım? Bir şey mi unuttum?

+1

Bu işlev çağrılır ve varsayılan olarak None değerini döndürür, böylece temel olarak altprocess.Popen (Yok) ' –

+0

olarak adlandırılırsınız. –

+0

Gerçekten ne yapmak istediğinize bağlı olarak, istediğinizi yapmak için daha kolay yollar vardır. Geriçağırım mantığının arkasındaki fikir nedir? –

cevap

1

subprocess modülü python geri çağrılarını yürütmek için uygun değildir. Bunun yerine multiprocessing module'a bakmak istiyorsunuz. Process ve Pool ile ilk birkaç örnek sizin istediğinizi yapıyor gibi görünüyor.

İlgili konular