Używam 2 oddzielnych skryptów, Scale1.py
i Scale2.py
. Aby je uruchomić, wpisuję sudo python Scale1.py
lub sudo python Scale2.py
z wiersza poleceń terminala. Chciałbym mieć linię w Scale2.py
, w którym po naciśnięciu przycisku program się psuje i uruchamia Scale1.py
. Coś takiego, co nie działa.
if GPIO.input(23) == False: break(sudo python Scale1.py)
Odpowiedź
os.system("sudo python scale1.py")
Najpierw musisz zaimportować moduł systemu operacyjnego
import os
Nie mam przy sobie numeru pi do przetestowania, ale to pochodzi z drugiej odpowiedzi na to pytanie: https://stackoverflow.com/questions/89228/calling-an-external-command-in-python
Komentarze
Odpowiedź
Ogólnie używaj modułu podprocesu
subprocess.call(["sudo","python","scale1.py"])
dla wywołań wiersza poleceń.
Przykład przetwarzania wyniku wywołania podprocesu;
result = subprocess.check_output(["sudo","service","mpd","restart"])
Podproces zastępuje kilka starszych modułów i funkcji, takich jak os.system i os.spawn . Świetnie radzi sobie z oczyszczaniem argumentów, więc chroni Cię przed wstrzyknięciem powłoki .
https://docs.python.org/2/library/subprocess.html
Oczywiście, aby uruchomić drugi skrypt w Pythonie, nie ma potrzeby wywoływania CLI, możesz je zaimportować.
Komentarze
Odpowiedź
Możesz użyć sudo zgodnie z sugestią harry sib, ale musisz dodać użytkownika uruchamiającego pierwszy skrypt do pliku sudoers .
Najlepszym sposobem na uruchomienie skryptu w języku Python z innego skryptu w języku Python jest jego zaimportowanie. Logikę skryptu powinieneś mieć w metodzie w drugim skrypcie:
# 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()
Komentarze
- +1, ponieważ Python to potrafi, będzie to
cleanest
odpowiedź. - +1 , to jest właściwy sposób robienia tego, czego chce OP i prawdopodobnie powinna być akceptowaną odpowiedzią.
os.system()
został usunięty na korzyśćsubprocess
, patrz stackoverflow.com/a/4256153/4212158