2011-01-31 12 views
52
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"]) 

अब मेरे पास एक स्क्रिप्ट है जो मैं चलाता हूं। जब मैं इसे चलाता हूं और यह इस पंक्ति को हिट करता है, तो यह प्रिंटिंग सामान शुरू करता है क्योंकि run.sh में प्रिंट होते हैं।मैं टेक्स्ट फ़ाइल में एक सबप्रोसेस कॉल कैसे पाइप करूं?

मैं इसे टेक्स्ट फ़ाइल में कैसे पाइप कर सकता हूं? (और भी प्रिंट, यदि संभव हो तो)

उत्तर

93

यदि आप किसी फ़ाइल में आउटपुट लिखना चाहते हैं तो आप stdout-subprocess.call का उपयोग कर सकते हैं।

None, subprocess.PIPE, एक फ़ाइल ऑब्जेक्ट या फ़ाइल डिस्क्रिप्टर लेता है। पहला डिफ़ॉल्ट है, stdout माता-पिता (आपकी स्क्रिप्ट) से विरासत में मिला है। दूसरा आपको एक कमांड/प्रक्रिया से दूसरे में पाइप करने की अनुमति देता है। तीसरे और चौथे भाग आप चाहते हैं कि एक फ़ाइल में आउटपुट लिखा जाए। ,

f = open("blah.txt", "w") 
subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) 

मैं किसी भी मान्य फ़ाइल जैसी वस्तु काम करेगा अनुमान लगा रहा हूँ एक सॉकेट (हांफी की तरह:

आप call को open की तरह कुछ के साथ एक फ़ाइल को खोलने और वस्तु या फ़ाइल वर्णनकर्ता पूर्णांक पास करनी होगी :)), लेकिन मैंने कभी कोशिश नहीं की है।

marcog टिप्पणियों में उल्लेख है कि आप stderr को भी रीडायरेक्ट करना चाहते हैं, तो आप इसे stderr=subprocess.STDOUT के साथ stdout के समान स्थान पर रीडायरेक्ट कर सकते हैं। उपरोक्त उल्लिखित मानों में से कोई भी काम करता है, आप विभिन्न स्थानों पर रीडायरेक्ट कर सकते हैं।

+1

हाँ, सॉकेट का काम भी। – ocodo

+1

subprocess.call (["echo", "1", ">>", "t.txt"] क्यों काम नहीं करता है? – Goldname

+2

@Goldname आपको पुनर्निर्देशन करने के लिए एक खोल की आवश्यकता है, इसलिए: 'subprocess.call ([" echo "," 1 "," >> "," t.txt "], shell = True) 'काम करना चाहिए। –

16

popen के लिए विकल्प call

args, 
bufsize=0, 
executable=None, 
stdin=None, 
stdout=None, 
stderr=None, 
preexec_fn=None, 
close_fds=False, 
shell=False, 
cwd=None, 
env=None, 
universal_newlines=False, 
startupinfo=None, 
creationflags=0 

तो में इस्तेमाल किया जा सकता ...

subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=myoutput) 

तो फिर तुम क्या आप myoutput साथ चाहते हैं (कर सकते हैं जो एक फ़ाइल बीटीडब्ल्यू होने की आवश्यकता होगी)।

इसके अलावा, आप इस तरह एक पाइप आउटपुट के करीब कुछ कर सकते हैं।

dmesg | grep hda 

होगा:

p1 = Popen(["dmesg"], stdout=PIPE) 
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 

python manual page पर सुंदर, उपयोगी जानकारी के बहुत सारे है।

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