Ik gebruik 2 aparte scripts, Scale1.py
en Scale2.py
. Om ze uit te voeren, voer ik sudo python Scale1.py
of sudo python Scale2.py
in vanaf de terminalopdrachtregel. Ik zou graag een regel willen hebben in de Scale2.py
script waarin als ik op een knop druk, het programma wordt afgebroken en Scale1.py
wordt uitgevoerd. Iets dergelijks, dat niet werkt.
if GPIO.input(23) == False: break(sudo python Scale1.py)
Antwoord
os.system("sudo python scale1.py")
eerst moet u de os-module importeren
import os
Ik heb geen pi met mij atm om te testen, maar dit komt van het tweede antwoord op deze vraag: https://stackoverflow.com/questions/89228/calling-an-external-command-in-python
Reacties
Antwoord
Gebruik in het algemeen de subproces module
subprocess.call(["sudo","python","scale1.py"])
voor command line calls.
Een voorbeeld van het verwerken van het resultaat van een subproces call;
result = subprocess.check_output(["sudo","service","mpd","restart"])
Subproces vervangt verschillende oudere modules en functies, zoals os.system en os.spawn . Het doet goed werk bij het opschonen van argumenten, dus het beschermt je tegen shell-injectie .
https://docs.python.org/2/library/subprocess.html
Om een tweede Python-script uit te voeren, is er natuurlijk geen CLI-aanroep nodig, je kunt deze importeren.
Opmerkingen
Antwoord
Je kunt sudo gebruiken zoals Harry sib suggereerde, maar je zou de gebruiker die het eerste script uitvoert moeten toevoegen aan het sudoers-bestand .
De beste manier om een python-script vanuit een ander python-script uit te voeren, is door het te importeren. Je zou de logica van je script in een methode in het tweede script moeten hebben:
# 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()
Reacties
- +1, aangezien Python hiertoe in staat is, zal dit het
cleanest
antwoord zijn. - +1 , dit is de juiste manier om te doen wat het OP wil en zou waarschijnlijk het geaccepteerde antwoord moeten zijn.
os.system()
is opgeheven ten gunste vansubprocess
, zie stackoverflow.com/a/4256153/4212158