Wie führe ich einen Befehlszeilenbefehl in einem Python-Skript aus?

16

Ich verwende 2 separate Skripte Scale1.pyund Scale2.py. Um sie auszuführen, gebe ich sudo python Scale1.pyoder sudo python Scale2.pyvon der Terminal-Befehlszeile aus ein. Ich hätte gerne eine Zeile im Scale2.pySkript, in der das Programm auf Knopfdruck abbricht und ausgeführt wird Scale1.py. So etwas funktioniert nicht.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Rico
quelle

Antworten:

24

os.system("sudo python scale1.py")

Zuerst müssen Sie das OS-Modul importieren

import os

Ich habe kein Pi zum Testen bei mir, aber dies ergibt sich aus der zweiten Antwort auf diese Frage: /programming/89228/calling-an-external-command-in-python

mrwhale
quelle
Das habe ich versucht und es hat funktioniert, vielen Dank Harry! Aber ich musste zuerst beide Programme kombinieren. Jetzt wird das os.system ("sudo python Scale3.py") einfach zu Beginn des Programms Scale3.py neu gestartet, was in Ordnung ist. Ich denke, Import Scale3.py wird auch funktionieren. Ich habe keinen Teilprozess ausprobiert, er sieht interessant aus und ist wahrscheinlich etwas, das ich lernen muss.
Rico
os.system()wurde zugunsten von verunglimpftsubprocess , siehe stackoverflow.com/a/4256153/4212158
crypdick
11

In der Regel verwenden die Subprozess Modul

subprocess.call(["sudo","python","scale1.py"]) 

für Kommandozeilenaufrufe.

Ein Beispiel für die Verarbeitung des Ergebnisses eines Unterprozessaufrufs.

 result = subprocess.check_output(['sudo','service','mpd','restart'])

Der Unterprozess ersetzt mehrere ältere Module und Funktionen wie os.system und os.spawn . Es leistet gute Arbeit bei der Bereinigung von Argumenten und schützt Sie vor der Injektion von Schalen .

https://docs.python.org/2/library/subprocess.html

Um ein zweites Python-Skript auszuführen, ist natürlich kein CLI-Aufruf erforderlich. Sie können diese importieren.

Janghou
quelle
Ich versuche zu lernen, wie man Befehle aus einem Python-Skript heraus ausgibt (siehe hier und hier ) und Probleme hat. Ich frage mich, ob subprocesses in meinem Fall auch besser sein könnte.
Uhoh
6

Sie können sudo wie von harry sib vorgeschlagen verwenden, müssen jedoch den Benutzer, der das erste Skript ausführt , zur sudoers-Datei hinzufügen .

Die beste Möglichkeit, ein Python-Skript von einem anderen Python-Skript aus auszuführen, besteht darin, es zu importieren. Sie sollten die Logik Ihres Skripts in einer Methode im zweiten Skript haben:

# Scale2.py
def run ():
    do_first ()
    do_second ()
    [...]

# Führen Sie es nur aus, wenn es über die Befehlszeile aufgerufen wird
if __name__ == '__main__':
    Lauf()
# Scale1.py
Scale2 importieren

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
quelle
2
+1, Da Python dazu in der Lage ist, wird es die cleanestAntwort sein.
LuWi
1
+1, dies ist der richtige Weg, um das zu tun, was das OP will und sollte wahrscheinlich die akzeptierte Antwort sein.