2012-04-20 13 views
25

dla następującego polecenia:Tłumienie wyjścia w python subprocess rozmowy

subprocess.call(shlex.split(
      """/usr/local/itms/bin/iTMSTransporter -m lookupMetadata 
       -apple_id %s -destination %s"""%(self.apple_id, self.destination)) 

Drukuje całe wyjście do okna terminala. W jaki sposób chciałbym tutaj wyłączyć WSZYSTKIE wyjście? Próbowałem robić subprocess.call(shlex.split(<command> > /dev/null 2&1)), ale nie przyniosło wymaganych wyników. Jak mam to zrobić tutaj?

Odpowiedz

35

Można użyć parametrów stdout= i stderr= do subprocess.call() kierować stdout lub stderr do deskryptora pliku do wyboru. Więc może coś takiego:

import os 

devnull = open(os.devnull, 'w') 
subprocess.call(shlex.split(
    '/usr/local/itms/bin/iTMSTransporter -m lookupMetadata ' 
    '-apple_id %s -destination %s' % (self,apple_id, self.destination)), 
    stdout=devnull, stderr=devnull) 

Korzystanie subprocess.PIPE, jeśli nie czytasz z rury, może spowodować program do blokowania jeśli generuje dużo mocy.

+27

możesz po prostu użyć os.devnull –

+3

Hej, wyglądam, że czegoś się nauczyłam. – larsks

+1

Jak dokładnie używasz os.devnull, aby poprawić tę odpowiedź? Dla mnie jest to tylko ciąg "/ dev/null", który nie jest dokładnie typem ulepszenia, który gwarantuje 10 przegranych. – RussellStewart

2

To, co zadziałało, to dołączenie na końcu polecenia 2>/dev/null.

+0

Dla przyszłych czytelników: takie podejście nie działa na wszystkich platformach/powłokach, nawet jeśli prawdopodobnie będzie działać na wszystkich nowościach i POSIX-y. –

+0

(również, działa to tylko z 'shell = True', którego chcesz uniknąć, gdy to możliwe) – larsks