Jeg bruger 2 separate scripts, Scale1.py
og Scale2.py
div For at køre dem indtaster jeg sudo python Scale1.py
eller sudo python Scale2.py
fra terminalens kommandolinje. Jeg vil gerne have en linje i Scale2.py
script, hvor hvis jeg trykker på en knap, bryder programmet og kører Scale1.py
. Noget som dette, der ikke fungerer.
if GPIO.input(23) == False: break(sudo python Scale1.py)
Svar
os.system("sudo python scale1.py")
først skal du importere OS-modulet
import os
Jeg har ikke en pi med min pengeautomat for at teste, men dette kommer fra det andet svar på dette spørgsmål: https://stackoverflow.com/questions/89228/calling-an-external-command-in-python
Kommentarer
Svar
Generelt skal du bruge underproces modul
subprocess.call(["sudo","python","scale1.py"])
til kommandolinjekald.
Et eksempel på behandling af resultatet af et underprocesopkald;
result = subprocess.check_output(["sudo","service","mpd","restart"])
Underproces erstatter flere ældre moduler og funktioner, som os.system og os.spawn . Det gør et godt stykke arbejde med at desinficere argumenter, så det beskytter dig mod skalinjektion .
https://docs.python.org/2/library/subprocess.html
For at køre et andet python-script er der naturligvis ikke behov for CLI-opkald, du kan importere dem.
Kommentarer
Svar
Du kan bruge sudo som foreslået af Harry sib, men du bliver nødt til at tilføje brugeren, der kører det første script til sudoers-filen .
Den bedste måde at køre et python-script fra et andet python-script er at importere det. Du skal have logikken til dit script i en metode i det andet script:
# 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()
Kommentarer
- +1, Da python er i stand til dette, vil det være
cleanest
svaret. - +1 , dette er den korrekte måde at gøre, hvad OP ønsker, og burde sandsynligvis være det accepterede svar.
os.system()
er blevet frataget til fordel forsubprocess
, se stackoverflow.com/a/4256153/4212158