2012-03-11 11 views
10

मैं निम्न पंक्ति पर उपप्रक्रिया उपयोग करना चाहते हैं:पायथन उपप्रोसेस: तीन बार पाइप का उपयोग कैसे करें?

convert ../loxie-orig.png bmp:- | mkbitmap -f 2 -s 2 -t 0.48 | potrace -t 5 --progress -s -o ../DSC00232.svg 

मैं अन्य पदों the subprocess documentation के लिए, लेकिन उदाहरण हम केवल दो बार पाइप का प्रयोग धन्यवाद पाया।

तो, मैं तीन आदेशों की दो के लिए कोशिश करते हैं और यह काम करता है

p1 = subprocess.Popen(['convert', fileIn, 'bmp:-'], stdout=subprocess.PIPE) 
# p2 = subprocess.Popen(['mkbitmap', '-f', '2', '-s', '2', '-t', '0.48'], stdout=subprocess.PIPE) 
p3 = subprocess.Popen(['potrace', '-t' , '5', '-s' , '-o', fileOut], stdin=p1.stdout,stdout=subprocess.PIPE) 
p1.stdout.close() # Allow p1 to receive a SIGPIPE if p3 exits. 
output = p3.communicate()[0] 

तुम मुझे तीसरे आदेश के लिए मदद कर सकते हैं?

बहुत बहुत धन्यवाद।

+1

क्या आप एक ही प्रक्रिया के साथ तीसरे आदेश के लिए इसे फिर से कोशिश? –

+0

आपने ऐसा क्यों नहीं किया है जिसने आपने काम किया है? एक पाइप में सभी पाइप एक प्रक्रिया के stdout एक दूसरे को stdin करने के लिए हुक अप है। – Dunes

+0

मुझे नहीं पता कि मुझे पी 2 को बंद करना है और आउटपुट को कैसे कोड करना है ... – Zorkzyd

उत्तर

19

बस एक ही उदाहरण का पालन करना एक तिहाई आदेश जोड़ें:

p1 = subprocess.Popen(['convert', fileIn, 'bmp:-'], stdout=subprocess.PIPE) 
p2 = subprocess.Popen(['mkbitmap', '-f', '2', '-s', '2', '-t', '0.48'], 
    stdin=p1.stdout, stdout=subprocess.PIPE) 
p1.stdout.close() 
p3 = subprocess.Popen(['potrace', '-t' , '5', '-s' , '-o', fileOut],   
    stdin=p2.stdout,stdout=subprocess.PIPE) 
p2.stdout.close() 

output = p3.communicate()[0] 
+0

मुझे विश्वास नहीं है, अब वे सभी जुड़े हुए हैं, मुझे लगता है कि केवल एक 'संवाद' कॉल की आवश्यकता होनी चाहिए। काम किया? –

+0

हां, यह अब काम करता है। धन्यवाद :) – Zorkzyd

+2

क्या इससे कोई फर्क पड़ता है कि 'p1.stdout.close() 'और' p2.stdout.close() 'output = p3.communicate() [0]' के बाद आते हैं? – sandyp

5

उपयोग विकल्प shell=True साथ subprocess.Popen(), और आप एक ही स्ट्रिंग के रूप में यह अपने पूरे आदेश पारित कर सकते हैं।

+0

यह अक्सर जाने का तरीका है (यह निश्चित रूप से बहुत आसान है) लेकिन कभी-कभी आप फाइल-नाम उद्धरण समस्याओं में भाग सकते हैं, उदाहरण के लिए, यदि 'fileIn' या' fileOut' नाम में कोई स्थान था। अधिकांश समय को संभालने के लिए 'pipes.quote' का उपयोग कर सकते हैं, लेकिन' shell = False' छोड़कर तकनीकी रूप से अधिक सुरक्षित है। – torek

1
def runPipe(cmds): 
try: 
    p1 = subprocess.Popen(cmds[0].split(' '), stdin = None, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
    prev = p1 
    for cmd in cmds[1:]: 
     p = subprocess.Popen(cmd.split(' '), stdin = prev.stdout, stdout = subprocess.PIPE, stderr = subprocess.PIPE) 
     prev = p 
    stdout, stderr = p.communicate() 
    p.wait() 
    returncode = p.returncode 
except Exception, e: 
    stderr = str(e) 
    returncode = -1 
if returncode == 0: 
    return (True, stdout.strip().split('\n')) 
else: 
    return (False, stderr) 

फिर इसे पसंद निष्पादित करें:

runPipe(['ls -1','head -n 2', 'head -n 1']) 
संबंधित मुद्दे