2010-02-26 17 views
14

में os.popen (कमांड) को पढ़ना मुझे यकीन नहीं है कि मेरा शीर्षक सही है या नहीं। मैं जो कुछ कर रहा हूं वह मेरे कुछ कोड लेखन को स्वचालित करने के लिए एक पायथन स्क्रिप्ट लिख रहा है। तो मैं एक .h फ़ाइल के माध्यम से पार्स कर रहा हूँ। लेकिन मैं शुरू करने से पहले सभी मैक्रोज़ का विस्तार करना चाहता हूं।एक स्ट्रिंग

gcc -E myHeader.h 

कौन सा बाहर stdout में myHeader.h के पद preprocessed संस्करण रखना चाहिए: तो मैं करने के लिए खोल के लिए एक कॉल करना चाहते हैं। अब मैं आगे की प्रक्रिया के लिए सीधे उस स्ट्रिंग में सभी आउटपुट को पढ़ना चाहता हूं। मैंने पढ़ा है कि मैं इसे पॉपन के साथ कर सकता हूं, लेकिन मैंने कभी पाइप ऑब्जेक्ट्स का उपयोग नहीं किया है।

मैं यह कैसे कर सकता हूं?

+1

डुप्लिकेट: http://stackoverflow.com/search?q=%5Bpython%5D+subprocess+output, http://stackoverflow.com/questions/1180606/using-subprocess-popen-for -प्रोसेस-इन-बड़े-आउटपुट, फिर भी, स्पष्ट और अच्छी तरह से पूछने के लिए +1, और "पोस्ट पी के लिए फिर से प्रोसेस "। :) –

उत्तर

20

os.popen समारोह सिर्फ एक फ़ाइल जैसी वस्तु देता है। आप यह बहुत की तरह उपयोग कर सकते हैं:

import os 

process = os.popen('gcc -E myHeader.h') 
preprocessed = process.read() 
process.close() 

के रूप में अन्य लोगों ने कहा है, तो आप subprocess.Popen का उपयोग कर किया जाना चाहिए। यह के safer version होने के लिए डिज़ाइन किया गया है। पायथन डॉक्स में section describing how to switch over है।

15
import subprocess 

p = subprocess.popen('gcc -E myHeader.h'.split(), 
        stdout=subprocess.PIPE) 
preprocessed, _ = p.communicate() 

स्ट्रिंग preprocessed अब कई उदाहरण preprocessed स्रोत की आवश्यकता है कर रहे हैं - और आप "सही" (आधुनिक) जिस तरह से उपयोग किया है पुरानी नहीं बल्कि पसंद किए जाने के बजाय, एक उपप्रोसेसर को खोलने के लिए- os.popen

+0

बहुत अच्छा उदाहरण। क्या स्टडआउट और स्टडर स्ट्रीम को अलग करने का कोई तरीका है? – smith324

2

os.popen() को पायथन 2.6 के बाद से हटा दिया गया है। ,, http://docs.python.org/2/library/subprocess.html#subprocess.Popen

import subprocess 

command = "gcc -E myHeader.h" # the shell command 
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None, shell=True) 

#Launch the shell command: 
output = process.communicate() 

print output[0] 

popen निर्माता में अगर खोलसच है आप एक स्ट्रिंग के रूप के बजाय एक दृश्य के रूप में आदेश पारित करना चाहिए: अब आप के बजाय उपप्रक्रिया मॉड्यूल का उपयोग करना चाहिए। अन्यथा, बस एक सूची में आदेश विभाजित:

command = ["gcc", "-E", "myHeader.h"] # the shell command 
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=None) 

आप भी मानक त्रुटि को पढ़ने के लिए की जरूरत है, popen प्रारंभ में, आप सेट stderrsubprocess.PIPE को या subprocess.STDOUT कर सकते हैं:

import subprocess 

command = "gcc -E myHeader.h" # the shell command 
process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 

#Launch the shell command: 
output, error = process.communicate()