क्या subprocess.call
का एक संस्करण है जो मानक आउटपुट के बिना प्रिंट किए बिना आदेश चला सकता है, या इसके मानक आउट संदेशों को अवरोधित करने का एक तरीका है?क्या subprocess.call का एक शांत संस्करण है?
उत्तर
हां। अपने stdout
को /dev/null
पर रीडायरेक्ट करें।
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
'पॉपन'' कॉल 'का एक रूप नहीं है। यह एक पूरी तरह से अलग समारोह है। – jwg
आप सही हैं। हालांकि पॉपन और कॉल के समान तर्क हैं इसलिए यह समाधान दोनों के लिए काम करते हैं। मैंने एक संपादन सबमिट किया है। – jhrf
ध्यान दें कि पायथन वर्क से। 3.3 वास्तव में एक 'subprocess.DEVNULL' है, जिसका उपयोग' ओपन (os.devnull, 'wb') के बजाय किया जा सकता है। – EquipDev
अक्सर उस तरह का बकवास stderr पर होता है, तो आप उसे भी चुप कर सकते हैं। यहाँ मेरी उदाहरण है:
from subprocess import call, DEVNULL
return_code = call(args, stderr=DEVNULL, stdout=DEVNULL)
नोट:subprocess.DEVNULL
अजगर 3.3 के बाद से उपलब्ध है। आप अजगर 2 पर अभी भी कर रहे हैं:
import os
with open(os.devnull, 'w') as shutup:
return_code = call(args, stdout=shutup, stderr=shutup)
यह देखते हुए कि 'startupinfo' का उपयोग करने के बारे में कोई जवाब नहीं दे रहा है जैसा कि यहां दिखाया गया है: http://code.activestate.com/recipes/409002-launching-a-subprocess-without-a-console-window/ चलते समय विंडो फ्लैशिंग से बचने के लिए एक कंसोल से पाइथन –
पायथन 3 में अब 'subprocess.DEVNULL' है (लेकिन आपका उत्तर 7 साल पुराना है) –
@ जीन-फ्रैंकोइसफैबर यह स्वीकार्य उत्तर पर एक टिप्पणी पर पहले से ही उल्लेख किया गया था। वैसे भी, मैंने इसे अभी संपादित किया है, सुझाव के लिए धन्यवाद। – wim
subprocess.call
भी stdin/stdout/stderr पुनर्निर्देशन स्वीकार करते हैं:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
[दस्तावेज़] (http://docs.python.org/2/library/subprocess.html#subprocess.call) विशेष रूप से कहते हैं "इस फ़ंक्शन के साथ stdout = PIPE या stderr = PIPE का उपयोग न करें।" – mpen
खुला() एक पीआईपीई वापस नहीं करता है, पीआईपीई का मतलब 'subprocess.PIPE' है जिसे प्रोग्राम के दूसरे छोर से पढ़ा जा सकता है। 'Os.devnull' के लिए एक खुला कारण नहीं होगा क्योंकि इस ब्लैक होल फ़ाइल के लिए कोई नीचे नहीं है, बफर कभी भरने वाला नहीं है। – BOYPT
आह। यह समझ आता है। धन्यवाद! मैं 'पॉपन' का उपयोग नहीं करना चाहता था क्योंकि यह स्टेटस कोड की बजाय प्रक्रिया लौटाता है। – mpen
यह एक नुस्खा है मैं एक बहुत का उपयोग करें: subprocess
फोन और आउटपुट एकत्रित करते हैं, और जब आदेश आउटपुट को त्यागने में सफल होता है, लेकिन जब यह आउटपुट प्रिंट करने में विफल रहता है।
import subprocess as sp
import sys
if "print" in __builtins__.__dict__:
prn = __builtins__.__dict__["print"]
else:
def prn(*args, **kwargs):
"""
prn(value, ..., sep=' ', end='\\n', file=sys.stdout)
Works just like the print function in Python 3.x but can be used in 2.x.
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
"""
sep = kwargs.get("sep", ' ')
end = kwargs.get("end", '\n')
file = kwargs.get("file", sys.stdout)
s = sep.join(str(x) for x in args) + end
file.write(s)
def rc_run_cmd_basic(lst_cmd, verbose=False, silent=False):
if silent and verbose:
raise ValueError("cannot specify both verbose and silent as true")
p = sp.Popen(lst_cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
tup_output = p.communicate()
s_cmd = ' '.join(lst_cmd)
if verbose:
prn()
prn("command: '%s'\n" % s_cmd)
if 0 != p.returncode:
prn()
prn("Command failed with code %d:" % p.returncode)
else:
prn("Command succeeded! code %d" % p.returncode)
if verbose:
prn("Output for: " + s_cmd)
prn(tup_output[0])
prn()
if not silent and 0 != p.returncode:
prn("Error output for: " + s_cmd)
prn(tup_output[1])
prn()
return p.returncode
मैं ऐसे मामलों में subprocess.check_output का उपयोग करता हूं और वापसी मूल्य छोड़ देता हूं। आप चेक कोड के स्थान पर check_output का उपयोग क्यों कर रहे हैं, यह बताते हुए आप अपना कोड टिप्पणी कर सकते हैं। विफलता होने पर check_output भी अच्छा होता है और आप त्रुटि आउटपुट में रूचि रखते हैं। नीचे उदाहरण कोड। आउटपुट केवल तभी देखा जाता है जब आप प्रिंट लाइन को असम्बद्ध करते हैं। यदि आदेश विफल रहता है, तो एक अपवाद फेंक दिया जाता है।
import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret
रिटर्न वैल्यू को छोड़ने से उत्पादन को रोकने के लिए कैसे रोकता है? – Emre
subprocess.check_output आउटपुट को कैप्चर करने और इसे वापस करने के लिए माना जाता है। क्या आप एक अलग व्यवहार देख रहे हैं? –
कार्यों को कैप्चर करना और अनदेखा करना, लेकिन कब्जे वाले मूल्य पर स्मृति को बर्बाद कर देता है जिसका उपयोग कभी नहीं किया जाता है। आउटपुट को सही ढंग से छोड़ना अधिक मजबूत है। – tripleee
बारीकी से विशेष रूप से संबंधित http://stackoverflow.com/questions/5495078/how-do-you-discard-subprocess-output-in-python, क्योंकि कॉल popen उपयोग करता है। –
संबंधित: [पायथन 2.7] में उपप्रोसेस के आउटपुट को कैसे छिपाना है (http://stackoverflow.com/q/11269575/4279) – jfs