2017-01-26 5 views
0

Ist es möglich, eine Befehlszeile Bash-Skript in Python ausführen? Ich kenne subprocess.call/check_output, um einen einzelnen Befehl mit Parametern auszuführen. Wie führe ich aberRun Bash Befehlszeilenskript in Python

in Python? Ich möchte die "Zeile" nicht in ein Shell-Skript einfügen und Python aufrufen lassen.

Danke!

+1

Mögliche Duplikate von [Wie Bash-Befehl in Python-Skript ausführen?] (Http://StackOverflow.com/Questions/26236126/How-To-Run-Bash-Command-inside-Python-Script) – Priya

+4

Es ist in der Tat möglich, Shell-Kommandozeilen aus Python heraus zu spawnen, aber dies ist ein [XY-Problem] (http://xyproduk.info/). Das willst du nicht machen. Mit diesem Code wäre eine bessere Frage etwas wie "Ich führe gerade folgendes in der Shell aus. Es funktioniert, aber könnte besser gemacht werden. Insbesondere muss ich etwas in Python implementieren, das die gleichen Ergebnisse erzeugt. Hier ist Mein Versuch, gefolgt von der Fehlermeldung, die ich bekomme, wenn ich es ausführe. "* – ghoti

+0

Ein guter erster Schritt wäre, den Shell-Code zu vereinfachen, den Sie jetzt haben. Zum Beispiel 'git branch -r | grep "tags /" 'kann durch' git branch --list -r 'tags/*' 'ersetzt werden. Die Befehlsersetzung, die als Argument für 'git tag' verwendet wird, kann (wahrscheinlich) einfach durch' '{tag # * tags /}" 'ersetzt werden. – chepner

Antwort

1

Wenn von Bash-Skript Umwandlung in Python Sie zwei Möglichkeiten gehen kann:

  1. Sie das Programm Anrufe übernehmen und nur den Looping/String-Verarbeitung ersetzen, z.B. wie folgt:

    from subprocess import check_output 
    for line in check_output('git branch -r', shell=True).split("\n"): 
        line = line.strip() 
        # do your replaces here, etc. leaving that for an exercise for you 
        # run more `check_call` or `check_output` here 
    
  2. Sie tun es "den richtigen Weg" und verwenden ein z. a python git module. Das ist zunächst mehr Arbeit, aber langfristig vorteilhaft, wie Sie mehr aus den Box-Funktionen erhalten, und haben wenige Fehler als in Ihren „schnell gehackt zusammen Shell Anrufen“

Edit: Als Kommentator zu Recht vermuten läßt, Sie sollten versuchen, shell=True zu vermeiden. In diesem Fall ist check_output(['git', 'branch', '-r']) sicherlich besser, in anderen Fällen, wenn Sie wissen, dass das Python-Skript auf einem Linux-Systemen und unter einer bestimmten Shell (zB Bash) ausgeführt wird, dann shell=True ermöglicht Ihnen den Zugriff auf Umgebungsvariablen unter angegeben .bashrc, globbing, etc. Für eine detaillierte Diskussion siehe here.

+0

Sie sind besser dran mit 'check_output (['git', 'branch', '-r'])' 'ohne' shell = True ', da die Shell hier nichts Nützliches beisteuert, außer das Kommando aufzuspalten Räume, die Sie selbst leicht machen können. (Zugegeben, es ist etwas weniger lesbar, aber die Vorteile überwiegen diese kleinen Unannehmlichkeiten enorm.) Siehe auch http://StackOverflow.com/questions/3172470/actual-meaning-of-shell-true-in-subprocess – tripleee

+0

@tripleee: danke für den Pointer denke ich generell, dass 'shell = True' den Weg von der Shell zu Python ebnet, aber natürlich sollte am Ende ein Skript funktionieren, das überall funktioniert, was bei Shell = True nicht der Fall ist. Ich habe der Antwort einen Abschnitt hinzugefügt – hansaplast

+1

Sehr gutes Update, +1. Ich neige dazu, vor 'shell = True' zu ​​warnen, weil Leute dazu neigen, Code von Stack Overflow zu kopieren/einfügen, ohne die Implikationen zu verstehen, und so sind Konstrukte mit erheblichen Nebenwirkungen problematisch, zumindest wenn man sie nicht aufruft. – tripleee