Jak uruchomić polecenie wiersza poleceń w skrypcie języka Python?

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

  • Próbowałem tego i zadziałało, wielkie dzięki Harry! Ale Musiałem najpierw połączyć oba programy. Teraz os.system (" sudo python Scale3.py ") po prostu uruchamia się ponownie na początku programu Scale3.py, co jest w porządku. Myślę, że import Scale3.py też będzie działać. Nie ' nie próbowałem podprocesu, wygląda to interesująco i prawdopodobnie muszę się tego nauczyć .
  • os.system() został usunięty na korzyść subprocess, patrz stackoverflow.com/a/4256153/4212158

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

  • Ja ' próbuję nauczyć się wydawać polecenia z poziomu skryptu Pythona (patrz tutaj i tutaj ) i masz pewne problemy. Zastanawiam się, czy subprocess może być lepsze również w moim przypadku.

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *