2009-06-25 14 views
5

मैं इस कमांड को सबप्रोसेस के साथ कैसे चला सकता हूं?पायथन - सबप्रोसेस - विंडोज़ में एक पाइप किए गए कमांड को कैसे कॉल करें?

मैंने कोशिश की:

proc = subprocess.Popen(
    '''ECHO bosco|"C:\Program Files\GNU\GnuPG\gpg.exe" --batch --passphrase-fd 0 --output "c:\docume~1\usi\locals~1\temp\tmptlbxka.txt" --decrypt "test.txt.gpg"''', 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
) 
stdout_value, stderr_value = proc.communicate() 

लेकिन मिल गया:

Traceback (most recent call last): 
... 
    File "C:\Python24\lib\subprocess.py", line 542, in __init__ 
    errread, errwrite) 
    File "C:\Python24\lib\subprocess.py", line 706, in _execute_child 
    startupinfo) 
WindowsError: [Errno 2] The system cannot find the file specified 

चीजें मैंने देखा है:

  1. खिड़कियों कंसोल ठीक काम करता है पर कमान चल रहा है।
  2. यदि मैं ईसीएचओ बोस्को हटा देता हूं। भाग, यह उपरोक्त पॉपन कॉल ठीक चलाता है। तो मुझे लगता है कि यह समस्या इको या से संबंधित है।
+0

है पूरी लाइन वास्तव में काम है कि जब आप इसे Windows कंसोल में चला

यह त्रुटि आपने देखा के साथ विफल हो? विंडोज एरर सुझाव देता है कि समस्या आपके पायथन कोड नहीं है, लेकिन वास्तविक आदेश निष्पादित किया जाना है। –

+0

हां, यह विंडोज डॉस कंसोल से चलता है। – Greg

उत्तर

11

सबसे पहले और सबसे महत्वपूर्ण, आपको वास्तव में एक पाइप की आवश्यकता नहीं है; आप सिर्फ इनपुट भेज रहे हैं। इसके लिए आप subprocess.communicate का उपयोग कर सकते हैं।

दूसरा, स्ट्रिंग के रूप में कमांड निर्दिष्ट न करें; जैसे ही रिक्त स्थान के साथ फ़ाइल नाम शामिल हैं, वह गन्दा है।

तीसरा, यदि आप वास्तव में एक पाइप कमांड निष्पादित करना चाहते हैं, तो बस खोल को कॉल करें। विंडोज़ पर, मुझे विश्वास है कि यह cmd /c program name arguments | further stuff है।

अंत में, एकल बैक स्लेश खतरनाक हो सकते हैं: "\p"'\\p' है, लेकिन '\n' एक नई लाइन है। os.path.join() या os.sep का उपयोग करें या, यदि बाहर पाइथन के बाहर निर्दिष्ट है, तो बस एक फॉरवर्ड स्लैश।

proc = subprocess.Popen(
    ['C:/Program Files/GNU/GnuPG/gpg.exe', 
    '--batch', '--passphrase-fd', '0', 
    '--output ', 'c:/docume~1/usi/locals~1/temp/tmptlbxka.txt', 
    '--decrypt', 'test.txt.gpg',], 
    stdin=subprocess.PIPE, 
    stdout=subprocess.PIPE, 
    stderr=subprocess.STDOUT, 
) 
stdout_value, stderr_value = proc.communicate('bosco') 
+0

धन्यवाद, यह काम किया! – Greg

4

आप सही थे, ईसीएचओ समस्या है। खोल के बिना = सही विकल्प ECHO कमांड नहीं मिला।

subprocess.call(["ECHO", "Ni"]) 

यह गुजरता है: प्रिंट नी और एक 0

subprocess.call(["ECHO", "Ni"], shell=True) 
+0

असल में, यह 'subprocess.call (" ECHO Ni ", shell = True) नहीं होना चाहिए? और 'subprocess.call ([" ईसीएचओ "," नी "]) 'मेरे लिए ठीक काम करता है। – Chris

+0

आप या तो [पॉपन कन्स्ट्रक्टर] (https://docs.python.org/3/library/subprocess.html#popen-constructor) के अनुसार उपयोग कर सकते हैं दस्तावेज़: "जब तक अन्यथा कहा न जाए, तो तर्कों को पारित करने की अनुशंसा की जाती है एक अनुक्रम के रूप में। " –

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