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

Ich verwende zwei separate Skripte, Scale1.py und Scale2.py Um sie auszuführen, gebe ich sudo python Scale1.py oder sudo python Scale2.py über die Terminalbefehlszeile ein. Ich möchte eine Zeile in der Scale2.py Skript, in dem das Programm beim Drücken einer Taste unterbrochen und Scale1.py ausgeführt wird. So etwas funktioniert nicht.

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

Antwort

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

Zuerst müssen Sie das Betriebssystemmodul

import os

Ich habe keinen Pi zum Testen bei mir, aber dies ergibt sich aus der zweiten Antwort auf diese Frage: https://stackoverflow.com/questions/89228/calling-an-external-command-in-python

Kommentare

  • Das habe ich versucht und es hat funktioniert, vielen Dank, Harry! Aber Ich musste zuerst beide Programme kombinieren. Jetzt wird das Betriebssystem (" sudo python Scale3.py ") einfach am Anfang neu gestartet Ich denke, der Import von Scale3.py wird auch funktionieren. Ich habe ' keinen Unterprozess ausprobiert, es sieht interessant aus und ist wahrscheinlich etwas, das ich lernen muss
  • os.system() wurde zugunsten von subprocess beraubt, siehe stackoverflow.com/a/4256153/4212158

Antwort

Verwenden Sie im Allgemeinen das Modul

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

für Befehlszeilenaufrufe.

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

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

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 daher vor Shell-Injection .

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.

Kommentare

  • Ich ' versuche zu lernen, wie Befehle aus einem Python-Skript ausgegeben werden (siehe hier und hier ) und einige Probleme. Ich frage mich, ob subprocess auch in meinem Fall besser sein könnte.

Antwort

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

Der beste Weg, 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() [...] # Run it only if called from the command line if __name__ == "__main__": run() 
 # Scale1.py import Scale2 if (GPIO.input(23) == False): Scale2.run() 

Kommentare

  • +1, Da Python dazu in der Lage ist, ist dies die cleanest Antwort.
  • +1 Dies ist der richtige Weg, um das zu tun, was das OP will und sollte wahrscheinlich die akzeptierte Antwort sein.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.