2013-02-12 19 views
25

मैं subprocess.Popen कॉल का उपयोग कर रहा हूं, और एक अन्य प्रश्न में मुझे पता चला कि मुझे गलतफहमी हुई है कि पाइथन कमांड लाइन के लिए तर्क कैसे उत्पन्न कर रहा था।subprocess द्वारा बुलाया कमांड लाइन आउटपुट?

मेरे प्रश्न
वहाँ पता लगाने के लिए क्या वास्तविक कमांड लाइन था कोई तरीका है?

उदाहरण कोड: -

proc = subprocess.popen(....) 
print "the commandline is %s" % proc.getCommandLine() 

कैसे आप getCommandLine लिखना चाहते हैं?

उत्तर

41

यह आपके द्वारा उपयोग किए जा रहे पायथन के संस्करण पर निर्भर करता है। In Python3.3, आर्ग proc.args में सहेजा गया है:

proc = subprocess.Popen(....) 
print("the commandline is {}".format(proc.args)) 

Python2.7, the args not saved में, यह सिर्फ पर अन्य कार्यों के लिए _execute_child की तरह पारित कर दिया है। तो, उस मामले में, सबसे अच्छा तरीका कमांड लाइन प्राप्त करने के लिए इसे सहेजने के लिए तुम्हारे पास है, जब:

proc = subprocess.Popen(shlex.split(cmd)) 
print "the commandline is %s" % cmd 

ध्यान दें कि आप (जैसे के प्रकार के रूप में बहस के सूची अगर

In [14]: import subprocess 

In [15]: import shlex 

In [16]: cmd = 'foo -a -b --bar baz' 

In [17]: shlex.split(cmd) 
Out[17]: ['foo', '-a', '-b', '--bar', 'baz'] 

In [18]: subprocess.list2cmdline(['foo', '-a', '-b', '--bar', 'baz']) 
Out[19]: 'foo -a -b --bar baz' 
+0

मैं 2.6 में हूं। और 2.6 में कम से कम यह अच्छा है कि list2cmdline अनियंत्रित है, क्योंकि यह काम नहीं करता है: '--arg = foo bar' के लिए वास्तव में क्या होता है '--arg = "foo bar' 'लेकिन क्या list2cmdline देता है' ' --arg = foo bar "'... लेकिन धन्यवाद। –

+0

मुझे लगता है कि समस्या 'list2cmdline' के साथ नहीं है, बल्कि' shlex.split' है। 'shlex.split ('- arg =" foo bar "') 'एक आइटम के साथ एक सूची देता है:' ['--arg = foo bar'] ', जबकि' shlex.split (' - arg = " foo bar "')' सही ढंग से तर्कों को विभाजित करता है: '[' --arg ',' = ',' foo bar ']'। इस बाद की सूची 'list2cmdline' ठीक काम करता है। – unutbu

+0

वैसे, पायथन 2.6 का 'सबप्रोसेस' मॉड्यूल 'args' को किसी सूची में कनवर्ट करने के लिए' list2cmdline' का उपयोग करता है जब भी 'args' स्ट्रिंग नहीं है, इसलिए यह इस अर्थ में काम कर रहा है कि आप ' list2cmdline (args) 'वास्तव में 'execvp *' या Windows समकक्ष पर क्या हो रहा है। – unutbu

2

मेरे सवाल का सही जवाब वास्तव में है कि वहाँ है: shlex.split(cmd) द्वारा लौटाए बात है, तो आप गैर-दस्तावेजी समारोह subprocess.list2cmdline का उपयोग कर कमांड लाइन स्ट्रिंग, cmd ठीक हो सकता है आईएस कोई कमांड लाइन नहीं है। उपप्रजाति का मुद्दा यह है कि यह आईपीसी के माध्यम से सबकुछ करता है। List2cmdline जितनी अपेक्षा की जा सकती है उतनी करीब है, लेकिन वास्तव में करने के लिए सबसे अच्छी बात यह है कि "तर्क" सूची देखें, और केवल यह जान लें कि यह प्रोग्राम प्रोग्राम में argv होगा।

+2

['list2cmdline()'] (https: // hg.python.org/cpython/file/f38489a3394f/Lib/subprocess.py#l541) केवल एमएस सी रनटाइम को कमांड लाइन के साथ संगत अनुप्रयोगों के लिए विंडोज़ पर उपयोगी है। यह तर्कों की एक सूची को एक स्ट्रिंग में परिवर्तित करता है जो 'CreateProcess() 'को पास किया जाता है। ['cmd.exe' विभिन्न नियमों का उपयोग करता है] (http://stackoverflow.com/q/27864103/4279)। POSIX पर सूची सीधे 'os.execve() '(+/- os.fsencode()) पर पारित की जाती है। – jfs

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