Was ich in der Kommandozeile mache:
cat file1 file2 file3 > myfile
Was ich mit Python machen möchte:
import subprocess, shlex
my_cmd = 'cat file1 file2 file3 > myfile'
args = shlex.split(my_cmd)
subprocess.call(args) # spits the output in the window i call my python program
python
subprocess
Katatemypythoncode
quelle
quelle
os.sendfile()
-basierte Lösung ist möglich, siehe Reproduzieren des Unix-Cat-Befehls in PythonAntworten:
UPDATE: Von os.system wird abgeraten, obwohl es in Python 3 noch verfügbar ist.
Verwendung
os.system
:Wenn Sie wirklich einen Unterprozess verwenden möchten, finden Sie hier die Lösung (meistens aus der Dokumentation für den Unterprozess entnommen):
OTOH, Sie können Systemaufrufe vollständig vermeiden:
quelle
os.system
und kannos.system
präzise modelliert werden , ist aber auch komplexer zu bearbeiten.os.system
kam vorhersubprocess
. Ersteres ist eine Legacy-API, die Letzteres ersetzen möchte.os.system()
oder verwendenshell=True
. Verwenden Sie denstdout
Parameter wie in der Antwort von Ryan Thompson gezeigt, um die Ausgabe eines Unterprozesses umzuleiten . Obwohl Siecat
in Ihrem Fall keinen Unterprozess ( ) benötigen , können Sie Dateien mit reinem Python verketten.In Python 3.5 und höher die Ausgabe zu umleiten, geben Sie einfach eine offene Datei - Handle für das
stdout
Argumentsubprocess.run
:Wie andere betont haben, ist die Verwendung eines externen Befehls wie
cat
für diesen Zweck völlig irrelevant.quelle
subprocess.run(my_cmd, stdout=outfile)
das ersetztsubprocess.call(...)
Natürlich:
quelle
Wenn Sie subprocess , muss der Prozess killed.This sein ist ein example.If Sie den Prozess nicht töten, Datei leer sein wird , und Sie können nothing.It lesen Sie weiter laufen kann Windows - .Ich kann leider nicht sicher, dass es laufen unter Unix.
quelle
for line in .readlines():
,s +=
) undproc.kill()
im Allgemeinen zu Informationsverlust führen kann (es nicht zulässt , dass die subprocess sanft beenden (unter Unix) - unflushed Inhalt verloren ). Auf jeden Fall ist der Hinweis zum Puffern als Kommentar besser geeignet.shlex.split()
, löschenshell=True
, löschen>file
, löschenopen()
, löschen usw. und verwenden Siestdout=PIPE
:Timer(1, proc.terminate).start()
;output = proc.communicate()[0]
stattdessen. Hier ist ein vollständiges Beispiel . Weitere Lösungen: Stoppen Sie das Lesen der Prozessausgabe in Python, ohne zu hängen? Hinweis: Die Frage, dass Sie den untergeordneten Prozess manuell beenden müssen, ist nicht erforderlich. Sie können auch andere Probleme beheben, z. B. kann sich ein Prozess anders verhalten, wenn seine Standardausgabe eine tty ist, aber nicht zum Thema gehört.Ein interessanter Fall wäre das Aktualisieren einer Datei durch Anhängen einer ähnlichen Datei. Dann müsste man dabei keine neue Datei erstellen. Dies ist besonders nützlich, wenn eine große Datei angehängt werden muss. Hier ist eine Möglichkeit, die temporäre Befehlszeile direkt von Python aus zu verwenden.
quelle