मैं एक पाठ फ़ाइल के लिए एक उपप्रकार कॉल कैसे पाइप कर सकता हूं?


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

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

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

जवाबों:


176

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

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

आपको किसी चीज़ के साथ एक फ़ाइल खोलने openऔर ऑब्जेक्ट या फ़ाइल डिस्क्रिप्टर पूर्णांक को पास करने की आवश्यकता है call:

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

मैं किसी भी मान्य फ़ाइल जैसी ऑब्जेक्ट का अनुमान लगा रहा हूं, जो सॉकेट (हांफना :)) की तरह काम करेगा, लेकिन मैंने कभी कोशिश नहीं की।

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


6
सबप्रोसेस.कॉल (["इको", "1", ">>", "t.txt"]) काम क्यों नहीं करता है?
StackOverflowOfficial

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

@WesMason धन्यवाद, लेकिन मैंने सोचा कि subprocess.call ने एक तरह से काम किया जो मूल रूप से खोल में नकल और चिपकाने जैसा था?
स्टैकऑवरफ्लोऑफिशियल

2
@ गॉडमेन नाह, सबप्रोसेस में सब कुछ अंतर्निहित पॉपेन क्लास पर निर्भर करता है, जो एक प्रक्रिया को खोलती है, शेल = ट्रू सिस्टम को डिफ़ॉल्ट शेल में निष्पादित करने के लिए प्रक्रिया को बाध्य करेगा (जैसे / पॉसिक्स सिस्टम पर बिन / श, जो आमतौर पर बैश या डैश होता है) ), यह उस तरह से अधिक सुरक्षित है जैसा कि आप शेल द्वारा प्रदान की गई अतिरिक्त कार्यक्षमता के लिए सभी के लिए खुले नहीं हैं (उपयोगकर्ता के लिए एक संपूर्ण प्रोग्रामिंग भाषा, यदि उपयोगकर्ता द्वारा प्रदान किए गए डेटा में पास किया गया है तो यह स्वयं के कारनामे हैं)। यह भी देख लें कि shlex.quoteक्या आप किसी संभावित गंदे डेटा को किसी सबशेल में पास कर रहे हैं।
वेस मेसन

4
काम पूरा होने के बाद क्या हमें भी फाइल बंद करनी चाहिए? हमारे द्वारा किए जाने के बाद यह फ़ाइल बंद कर देगा: with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @Skurmedel
alper

19

के विकल्पों का 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(जिसे एक फ़ाइल btw की आवश्यकता होगी)।

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

dmesg | grep hda

होने वाला:

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

अजगर मैनुअल पेज पर बहुत सारी सुंदर, उपयोगी जानकारी है ।


-2

तुम भी बस टर्मिनल से स्क्रिप्ट कॉल कर सकते हैं, सब कुछ एक फ़ाइल के लिए outputting, अगर यह मदद करता है। इस तरफ:

$ /path/to/the/script.py > output.txt

यह फ़ाइल को अधिलेखित कर देगा। आप >>इसे संलग्न करने के लिए उपयोग कर सकते हैं ।

यदि आप चाहते हैं कि त्रुटियाँ फ़ाइल में भी लॉग इन हों, तो उपयोग करें &>>या &>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.