Was entspricht den Backticks in Ruby und Perl in Python? Das heißt, in Ruby kann ich Folgendes tun:
foo = `cat /tmp/baz`
Wie sieht die entsprechende Anweisung in Python aus? Ich habe es versucht, os.system("cat /tmp/baz")
aber das setzt das Ergebnis auf Standard und gibt mir den Fehlercode dieser Operation zurück.
Antworten:
quelle
`...`
(Erfassen von stdout, Durchlaufen von stderr) - mit einer Ausnahme: Ruby ermöglicht es, den Exit-Code des Prozesses nachträglich zu bestimmen$?
. In Python müssen Sie, soweit ich das beurteilen kann,subprocess
die Funktionen des Moduls dafür verwenden.Am flexibelsten ist die Verwendung des
subprocess
Moduls:capture_output
wurde in Python 3.7 eingeführt, für ältere Versionencheck_output()
kann stattdessen die Sonderfunktion verwendet werden:Sie können ein Unterprozessobjekt auch manuell erstellen, wenn Sie eine fein abgestimmte Steuerung benötigen:
Alle diese Funktionen unterstützen Schlüsselwortparameter, um anzupassen, wie genau der Unterprozess ausgeführt wird. Sie können
shell=True
das Programm beispielsweise über die Shell ausführen, wenn Sie beispielsweise Dateinamenerweiterungen von benötigen*
, dies ist jedoch mit Einschränkungen verbunden .quelle
subprocess.run()
(ich weiß nicht, ob dies verdient ist), wenn Sie frühere Versionen nicht unterstützen müssen oder wenn Sie die von bereitgestellte Flexibilität nicht benötigenPopen()
.etw ist richtig . Sie können auch os.popen () verwenden, aber wo verfügbar (Python 2.4+) ist der Unterprozess im Allgemeinen vorzuziehen.
Im Gegensatz zu einigen Sprachen, die dies fördern, wird es im Allgemeinen als schlechte Form angesehen, einen Unterprozess zu erzeugen, in dem Sie denselben Job innerhalb der Sprache ausführen können. Es ist langsamer, weniger zuverlässig und plattformabhängig. Ihr Beispiel wäre besser dran als:
eta:
? Katze in einem Verzeichnis bekommt mir einen Fehler.
Wenn Sie eine Liste von Dateien wünschen:
Wenn Sie den Inhalt aller Dateien in einem Verzeichnis haben möchten, gehen Sie wie folgt vor:
Wenn Sie sicher sein können, dass dort keine Verzeichnisse vorhanden sind, können Sie es in einen Einzeiler einfügen:
quelle
quelle
Ab Python 3.5 wird die Verwendung empfohlen
subprocess.run
. Um das gleiche Verhalten wie beschrieben zu erzielen, würden Sie Folgendes verwenden:Dies gibt ein
bytes
Objekt zurück. Vielleicht möchten Sie anhängen.decode("ascii")
oder.decode("utf-8")
bis zum Ende, um eine zu erhaltenstr
.quelle
Am einfachsten ist es, das Befehlspaket zu verwenden.
Ausgabe:
quelle
quelle
Ich benutze
Eines der obigen Beispiele ist:
Für mich war dies kein Zugriff auf das Verzeichnis / tmp. Nachdem ich mir die Dokumentzeichenfolge für den Unterprozess angesehen hatte, ersetzte ich sie
mit
und bekam das gewünschte Shell-Expansionsverhalten (a la Perls `prog arg`)
Ich habe vor einiger Zeit aufgehört, Python zu verwenden, weil ich mich über die Schwierigkeit geärgert habe, das Äquivalent von Perl `cmd ...` zu machen. Ich bin froh, dass Python dies vernünftig gemacht hat.
quelle
Wenn Sie subprocess.Popen verwenden, denken Sie daran, bufsize anzugeben. Der Standardwert ist 0, was "ungepuffert" bedeutet, nicht "Wählen Sie einen angemessenen Standardwert".
quelle
Dies funktioniert in Python3 nicht, aber in Python2 können Sie
str
mit einer benutzerdefinierten__repr__
Methode erweitern, die Ihren Shell-Befehl aufruft und wie folgt zurückgibt:Was du gerne benutzen kannst
quelle
repr()
Der
backtick
Operator (`) wurde entfernt inPython 3
. Es ähnelt verwirrend einem einfachen Anführungszeichen und ist auf einigen Tastaturen schwer zu tippen.backtick
Verwenden Sie anstelle von die entsprechende integrierte Funktionrepr()
.quelle