2011-12-16 7 views
35

क्या subprocess.call का एक संस्करण है जो मानक आउटपुट के बिना प्रिंट किए बिना आदेश चला सकता है, या इसके मानक आउट संदेशों को अवरोधित करने का एक तरीका है?क्या subprocess.call का एक शांत संस्करण है?

+0

बारीकी से विशेष रूप से संबंधित http://stackoverflow.com/questions/5495078/how-do-you-discard-subprocess-output-in-python, क्योंकि कॉल popen उपयोग करता है। –

+0

संबंधित: [पायथन 2.7] में उपप्रोसेस के आउटपुट को कैसे छिपाना है (http://stackoverflow.com/q/11269575/4279) – jfs

उत्तर

40

हां। अपने stdout को /dev/null पर रीडायरेक्ट करें।

process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb')) 
+1

'पॉपन'' कॉल 'का एक रूप नहीं है। यह एक पूरी तरह से अलग समारोह है। – jwg

+1

आप सही हैं। हालांकि पॉपन और कॉल के समान तर्क हैं इसलिए यह समाधान दोनों के लिए काम करते हैं। मैंने एक संपादन सबमिट किया है। – jhrf

+4

ध्यान दें कि पायथन वर्क से। 3.3 वास्तव में एक 'subprocess.DEVNULL' है, जिसका उपयोग' ओपन (os.devnull, 'wb') के बजाय किया जा सकता है। – EquipDev

19

अक्सर उस तरह का बकवास 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) 
+0

यह देखते हुए कि 'startupinfo' का उपयोग करने के बारे में कोई जवाब नहीं दे रहा है जैसा कि यहां दिखाया गया है: http://code.activestate.com/recipes/409002-launching-a-subprocess-without-a-console-window/ चलते समय विंडो फ्लैशिंग से बचने के लिए एक कंसोल से पाइथन –

+0

पायथन 3 में अब 'subprocess.DEVNULL' है (लेकिन आपका उत्तर 7 साल पुराना है) –

+0

@ जीन-फ्रैंकोइसफैबर यह स्वीकार्य उत्तर पर एक टिप्पणी पर पहले से ही उल्लेख किया गया था। वैसे भी, मैंने इसे अभी संपादित किया है, सुझाव के लिए धन्यवाद। – wim

10

subprocess.call भी stdin/stdout/stderr पुनर्निर्देशन स्वीकार करते हैं:

process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb')) 
+2

[दस्तावेज़] (http://docs.python.org/2/library/subprocess.html#subprocess.call) विशेष रूप से कहते हैं "इस फ़ंक्शन के साथ stdout = PIPE या stderr = PIPE का उपयोग न करें।" – mpen

+6

खुला() एक पीआईपीई वापस नहीं करता है, पीआईपीई का मतलब 'subprocess.PIPE' है जिसे प्रोग्राम के दूसरे छोर से पढ़ा जा सकता है। 'Os.devnull' के लिए एक खुला कारण नहीं होगा क्योंकि इस ब्लैक होल फ़ाइल के लिए कोई नीचे नहीं है, बफर कभी भरने वाला नहीं है। – BOYPT

+0

आह। यह समझ आता है। धन्यवाद! मैं 'पॉपन' का उपयोग नहीं करना चाहता था क्योंकि यह स्टेटस कोड की बजाय प्रक्रिया लौटाता है। – mpen

1

यह एक नुस्खा है मैं एक बहुत का उपयोग करें: 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 
0

मैं ऐसे मामलों में subprocess.check_output का उपयोग करता हूं और वापसी मूल्य छोड़ देता हूं। आप चेक कोड के स्थान पर check_output का उपयोग क्यों कर रहे हैं, यह बताते हुए आप अपना कोड टिप्पणी कर सकते हैं। विफलता होने पर check_output भी अच्छा होता है और आप त्रुटि आउटपुट में रूचि रखते हैं। नीचे उदाहरण कोड। आउटपुट केवल तभी देखा जाता है जब आप प्रिंट लाइन को असम्बद्ध करते हैं। यदि आदेश विफल रहता है, तो एक अपवाद फेंक दिया जाता है।

import subprocess 
ret = subprocess.check_output(["cat", "/tmp/1"]) 
#print ret 
+0

रिटर्न वैल्यू को छोड़ने से उत्पादन को रोकने के लिए कैसे रोकता है? – Emre

+0

subprocess.check_output आउटपुट को कैप्चर करने और इसे वापस करने के लिए माना जाता है। क्या आप एक अलग व्यवहार देख रहे हैं? –

+0

कार्यों को कैप्चर करना और अनदेखा करना, लेकिन कब्जे वाले मूल्य पर स्मृति को बर्बाद कर देता है जिसका उपयोग कभी नहीं किया जाता है। आउटपुट को सही ढंग से छोड़ना अधिक मजबूत है। – tripleee

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

  • कोई संबंधित समस्या नहीं^_^