2010-08-11 13 views
7

के बीच असंगत व्यवहार है I समस्या/मानक के टर्मिनल से अलग प्रोप्रोसेस के पॉपन() के परिणामों की व्याख्या करने वाली समस्या ग्रहण/पायचर्म के साथ है। सभी ओएसएक्स पर पायथन 2.6.1 का उपयोग कर रहे हैं।subprocess.Popen() में ग्रहण/पायचर्म और टर्मिनल निष्पादन

import subprocess 

args = ["/usr/bin/which", "git"] 
print "Will execute %s" % " ".join(args) 
try: 
    p = subprocess.Popen(["/usr/bin/which", "git"], shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    # tuple of StdOut, StdErr is the responses, so .. 
    ret = p.communicate() 
    if ret[0] == '' and ret[1] <> '': 
    msg = "cmd %s failed: %s" % (fullcmd, ret[1]) 
    if fail_on_error: 
     raise NameError(msg) 
except OSError, e: 
    print >>sys.stderr, "Execution failed:", e 
एक मानक टर्मिनल के साथ

, लाइन:

यहाँ एक सरल उदाहरण स्क्रिप्ट है

(Pdb) print ret 
('/usr/local/bin/git\n', '') 

ग्रहण और PyCharm मुझे एक खाली टपल दे:

ret = p.communicate() 

मुझे देता है :

ret = {tuple} ('','') 

खोल = मूल्य बदलना समस्या को हल नहीं करता है। टर्मिनल पर, खोल = सही सेट करना, और पूरी तरह से कमांड को पास करना (यानी, args = ["/ usr/bin/which git"]) मुझे एक ही परिणाम देता है: ret = ('/ usr/local/bin/git \ n ',' ')। और ग्रहण/PyCharm दोनों मुझे एक खाली tuple दे।

कोई विचार क्या मैं गलत कर सकता हूं?

उत्तर

14

ठीक है, समस्या मिली, और यूनिक्स-प्रकार के वातावरण में आईडीई का उपयोग करते समय ध्यान में रखना एक महत्वपूर्ण बात है। आईडीई टर्मिनल उपयोगकर्ता (डुह, दाएं ?!) की तुलना में एक अलग पर्यावरण संदर्भ के तहत काम करता है। मैं इस बात पर विचार नहीं कर रहा था कि उपप्रोसेसर मेरे टर्मिनल के संदर्भ में एक अलग वातावरण का उपयोग कर रहा था (मेरे टर्मिनल में bash_profile को पैथ में और चीजें रखने के लिए सेट किया गया है)।

यह आसानी से स्क्रिप्ट को बदलने के रूप में निम्नानुसार द्वारा सत्यापित किया गया है:

import subprocess 
args = ["/usr/bin/which", "git"] 
print "Current path is %s" % os.path.expandvars("$PATH") 
try: 
    p = subprocess.Popen(args, shell=False, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
    # tuple of StdOut, StdErr is the responses, so .. 
    out, err = p.communicate() 
    if err: 
    msg = "cmd %s failed: %s" % (fullcmd, err) 
except OSError, e: 
    print >>sys.stderr, "Execution failed:", e 

टर्मिनल के तहत, पथ/usr/स्थानीय/बिन भी शामिल है। आईडीई के तहत यह नहीं है!

यह मेरे लिए एक महत्वपूर्ण गॉचा है - हमेशा वातावरण के बारे में याद रखें!

+0

वाह, मुझे विंडोज के तहत एक ही समस्या थी और आपने मुझे सही दिशा में इंगित किया! धन्यवाद। कंसोल से लॉन्च किए गए एक दुभाषिया के पास "सिस्टम" और "वर्तमान उपयोगकर्ता" $ PATH चर दोनों तक पहुंच है, जबकि आईडीई या एक्सप्लोरर से लॉन्च किए गए एक दुभाषिया या प्रोग्राम के पास केवल "सिस्टम" $ PATH तक पहुंच है। –

+0

एक्लिप्स को टर्मिनल से उपलब्ध सभी संदर्भों को शामिल करने का समाधान क्या है? धन्यवाद! – Tarelli