2009-06-17 11 views
8

ben çocuk sürecini başlatmak ve alt süreç modülü kullanarak Python Linux üzerinde çıkışını almaya çalışıyorum:Popen.communicate() OSError atar: "[Errno 10] Hiçbir çocuk süreçler"

#!/usr/bin/python2.4 
import subprocess 

p = subprocess.Popen(['ls', '-l', '/etc'], 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
out, err = p.communicate() 

Ancak, bazı pul pul tecrübe: bazen, p.communicate()

OSError: [Errno 10] No child processes 

ne bu istisnayı neden olabilir atar ki? Burada, düzensizliğe neden olabilecek herhangi bir determinizm ya da ırk koşulu var mı?

+0

Hangi sürüm python kullanıyorsunuz? Eğer 'extra_args' çıkarsam benim için iyi çalışıyor – sqram

cevap

3

Burada sözü edilen hata haline çalışıyor olabilir: http://bugs.python.org/issue1731717

+1

Bu hata python'u 2.5/2.6'ya güncellemeyi düşünürse. Çözüldü. – kjfletch

+2

2010-09-29 itibariyle, hata hala "open/needs patch" olarak işaretlenmiş ve 3.2, 3.1, 2.7, 2.6 sürümlerini etkilemektedir. – fotinakis

0

benim Python (2.4.6-1ubuntu3) bu çoğalabilen değilim. Senaryonuzu nasıl çalıştırıyorsun? Bu ne sıklıkla oluşur?

0

Ev dizinime yerleştirdiğim Python 2.6.4 kullanarak bu soruna girdim (çünkü "yerleşik" Python'u makineye yükseltmek istemiyorum).

subprocess.Popen()'u (kullanımdan kaldırıldı) os.popen3() ile değiştirerek çalıştım.

6

SIGCHLD'i komut dosyasında engelliyor musunuz? Eğer öyleyseniz Popen beklendiği gibi çalışmayacaktır çünkü bu sinyal için kendi işleyicisine güvenir.

Sen POPEN çağrıyı dışında yorum ve ardından çalıştırarak SIGCHLD işleyicileri kontrol edebilirsiniz:

rt_sigaction(SIGCHLD, ...) 

sonra, başın belada:

strace python <your_script.py> | grep SIGCHLD 

Eğer benzer bir şey görürseniz. Popen'i çağırmadan önce işleyiciyi devre dışı bırakmanız ve daha sonra iletişim kurulduktan sonra sıfırlamanız gerekir (bu, bir yarış koşuluna dikkat edin).

signal.signal(SIGCHLD, handler) 
... 
signal.signal(SIGCHLD, signal.SIG_DFL) 
''' 
now you can go wild with Popen. 
WARNING!!! during this time no signals will be delivered to handler 
''' 
... 
signal.signal(SIGCHLD, handler) 

Orada bu rapor bir piton hata olduğunu ve bildiğim kadarıyla gördüğüm kadarıyla henüz çözülmüş değil: yardımcı

http://bugs.python.org/issue9127

Umut.

+0

Merhaba http://bugs.python.org/issue9127 bağlantıyı ziyaret etti ancak sorunun hangi python yayınlandığını çözemediğini belirleyemedi. Bana aynı şekilde yardım edebilir misin? –

+0

Bu sorunları çözen bir sürüm listesi aşağıdadır. Http://bugs.python.org/issue1731717#msg260457 –

+0

Yukarıda açıklanan mesaj ve bağlantı, hatanın dosyalandığı sürümlere göre doğru görünmüyor. Python 3.1, Python 3.2, Python 2.7, Python 2.6 bu Python sürümlerinde, hatanın bulunduğu belirtilir. –

İlgili konular