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 vonsubprocess
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
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.