2009-06-17 15 views
8

मैं एक बच्चे की प्रक्रिया शुरू करने और उपप्रक्रिया मॉड्यूल का उपयोग कर अजगर से लिनक्स पर इसके उत्पादन प्राप्त करने के लिए कोशिश कर रहा हूँ:Popen.communicate() OSError फेंकता है: "[errno 10] कोई बच्चा प्रक्रियाओं"

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

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

हालांकि, मुझे कुछ flakiness का अनुभव होता है: कभी-कभी, p.communicate()

OSError: [Errno 10] No child processes 

इस अपवाद का कारण क्या हो सकता है? क्या यहां कोई गैर-निर्धारणा या दौड़ की स्थिति है जो चक्कर आ सकती है?

+0

आप अजगर का किस संस्करण का उपयोग कर रहे हैं? यह मेरे लिए ठीक काम करता है अगर मैं 'extra_args' – sqram

उत्तर

3

आप बग यहाँ उल्लेख में चल रहा हो सकता है: http://bugs.python.org/issue1731717

+1

निकालता हूं यदि यह बग आपके पाइथन को 2.5/2.6 पर अपडेट करने पर विचार करता है। इसे हल किया गया है। – kjfletch

+2

2010-09-29 तक बग को अभी भी "खुली/जरूरत पैच" के रूप में चिह्नित किया गया है और संस्करण 3.2, 3.1, 2.7, 2.6 को प्रभावित करता है। – fotinakis

0

मैं अपने अजगर (2.4.6-1ubuntu3) पर इस प्रजनन करने में सक्षम नहीं हूँ। आप अपनी स्क्रिप्ट कैसे चला रहे हैं? यह कितनी बार होता है?

0

मैं पाइथन 2.6.4 का उपयोग करके इस समस्या में भाग गया जिसे मैंने अपनी होम निर्देशिका में बनाया (क्योंकि मैं मशीन पर "अंतर्निर्मित" पायथन को अपग्रेड नहीं करना चाहता हूं)।

मैंने subprocess.Popen() (बहिष्कृत) os.popen3() के साथ प्रतिस्थापित किया।

6

क्या आप स्क्रिप्ट में सिग्लड को रोक रहे हैं? यदि आप हैं तो पॉपन अपेक्षित नहीं होंगे क्योंकि यह उस सिग्नल के लिए अपने हैंडलर पर निर्भर करता है।

आप popen कॉल बाहर टिप्पणी और उसके बाद चलाकर SIGCHLD संचालकों के लिए जाँच कर सकते हैं:

rt_sigaction(SIGCHLD, ...) 

तो आप मुसीबत में हैं:

strace python <your_script.py> | grep SIGCHLD 

अगर आप जैसा कुछ दिखाई। पॉपन को कॉल करने से पहले आपको हैंडलर को अक्षम करने की आवश्यकता है और फिर संचार के बाद इसे रीसेट कर दिया जाना चाहिए (यह दौड़ की स्थिति को सावधानी बरत सकता है)।

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) 

वहाँ एक अजगर बग इस पर सूचना दी है और जहाँ तक मैं इसे देखना के रूप में अभी तक हल नहीं किया गया:

http://bugs.python.org/issue9127

आशा है कि मदद करता है।

+0

हाय http://bugs.python.org/issue9127 लिंक का दौरा किया लेकिन यह पता नहीं लगा सका कि किस पायथन को जारी किया गया है। क्या आप इसके साथ मेरी मदद कर सकते हैं। –

+0

यहां रिलीज़ की एक सूची है जो इन मुद्दों को हल करती है http://bugs.python.org/issue1731717#msg260457 –

+0

ऊपर साझा किया गया संदेश और लिंक सही नहीं लगता है, क्योंकि संस्करणों के अनुसार बग दायर किया गया है पायथन 3.1, पायथन 3.2, पायथन 2.7, पायथन 2.6 इन पायथन संस्करणों का उल्लेख किया गया है जिसमें बग पाया गया था। –

संबंधित मुद्दे