Wie leite ich einen Unterprozessaufruf an eine Textdatei weiter?


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

Jetzt habe ich ein Skript, das ich ausführe. Wenn ich es ausführe und es auf diese Zeile trifft, beginnt es mit dem Drucken, da run.sh Drucke enthält.

Wie leite ich dies auch in eine Textdatei? (Und wenn möglich auch drucken)

Antworten:


170

Wenn Sie die Ausgabe in eine Datei schreiben möchten, können Sie das stdout -argument von verwenden subprocess.call.

Es dauert None, subprocess.PIPEein Datei - Objekt oder eine Dateibeschreibung. Der erste ist der Standardwert, stdout wird vom übergeordneten Element (Ihrem Skript) geerbt. Mit der zweiten können Sie von einem Befehl / Prozess zu einem anderen weiterleiten. Der dritte und vierte sind das, was Sie möchten, damit die Ausgabe in eine Datei geschrieben wird.

Sie müssen eine Datei mit so etwas wie öffnen openund die Ganzzahl des Objekts oder des Dateideskriptors an Folgendes übergeben call:

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

Ich vermute, dass jedes gültige dateiähnliche Objekt funktionieren würde, wie ein Socket (keuchen :)), aber ich habe es nie versucht.

Wie Marcog in den Kommentaren erwähnt, möchten Sie möglicherweise auch stderr umleiten. Sie können dies an denselben Speicherort wie stdout umleiten stderr=subprocess.STDOUT. Jeder der oben genannten Werte funktioniert auch. Sie können an verschiedene Stellen umleiten.


5
Warum funktioniert subprocess.call (["echo", "1", ">>", "t.txt"]) nicht?
StackOverflowOfficial

7
@Goldname Sie benötigen eine Shell, um die Umleitung durchzuführen, also: subprocess.call(["echo", "1", ">>", "t.txt"], shell=True)sollte funktionieren.
Wes Mason

@WesMason Danke, aber ich dachte, subprocess.call funktioniert auf eine Art und Weise, die im Grunde wie das Kopieren und Einfügen in die Shell ist?
StackOverflowOfficial

2
@Goldname nah, alles im Unterprozess hängt von der zugrunde liegenden Popen-Klasse ab, die einen Prozess öffnet. Shell = True erzwingt die Ausführung des Prozesses in der Systemstandard-Shell (z. B. / bin / sh auf POSIX-Systemen, die normalerweise bash oder dash ist ) ist es auf diese Weise sicherer, da Sie nicht für alle zusätzlichen Funktionen der Shell offen sind (eine ganze Programmiersprache für sich, mit eigenen Exploits, wenn vom Benutzer bereitgestellte Daten übergeben werden). shlex.quoteÜberprüfen Sie auch, ob Sie möglicherweise verschmutzte Daten an eine Subshell übergeben.
Wes Mason

4
Sollten wir die Datei auch schließen, wenn wir fertig sind? Dies wird die Datei schließen, nachdem wir fertig sind: with open("blah.txt","w") as f: subprocess.call(["/home/myuser/run.sh", "/tmp/ad_xml", "/tmp/video_xml"], stdout=f) @ Kurkurel
Alper

18

Die Optionen für popenkönnen in verwendet werdencall

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

So...

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

Dann können Sie tun, was Sie wollen myoutput(was übrigens eine Datei sein müsste).

Sie können auch etwas näher an einem Pipeline-Ausgang wie diesem tun.

dmesg | grep hda

wäre:

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

Auf der Python-Handbuchseite finden Sie viele nützliche Informationen .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.