Jak uruchomić polecenie wiersza polecenia w skrypcie Python?

16

Używam 2 oddzielnych skryptów Scale1.pyi Scale2.py. Aby je uruchomić, wchodzę sudo python Scale1.pylub sudo python Scale2.pyz linii poleceń terminala. Chciałbym mieć wiersz w Scale2.pyskrypcie, w którym po naciśnięciu przycisku program się zepsuje i uruchomi Scale1.py. Coś takiego, co nie działa.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)
Rico
źródło

Odpowiedzi:

24

os.system("sudo python scale1.py")

najpierw musisz zaimportować moduł os

import os

Nie mam przy sobie bankomatu pi do przetestowania, ale pochodzi on z drugiej odpowiedzi na to pytanie: /programming/89228/calling-an-external-command-in-python

mrwhale
źródło
Właśnie tego próbowałem i zadziałało, wielkie dzięki Harry! Ale najpierw musiałem 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 również będzie działał. Nie próbowałem podprocesu, wygląda interesująco i prawdopodobnie muszę się go nauczyć.
Rico
os.system()został deprecjonowany na korzyść subprocess, patrz stackoverflow.com/a/4256153/4212158
crypdick
12

Ogólnie używaj modułu podprocesu

subprocess.call(["sudo","python","scale1.py"]) 

do wywołań z linii 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 . Dobrze sprawdza się w odkażaniu 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 Pythona, nie ma potrzeby wywoływania CLI, możesz je zaimportować.

Janghou
źródło
Próbuję nauczyć się wydawać polecenia z poziomu skryptu Python (patrz tutaj i tutaj ) i mam pewne problemy. Zastanawiam się, czy subprocessmoże być też lepiej w moim przypadku.
uhoh
6

Możesz użyć sudo, jak sugeruje harry sib, ale musisz dodać użytkownika uruchamiającego pierwszy skrypt do pliku sudoers .

Najlepszym sposobem na uruchomienie skryptu Python z innego skryptu Python jest jego zaimportowanie. Powinieneś mieć logikę swojego skryptu w metodzie w drugim skrypcie:

# Scale2.py
def run ():
    Ty pierwszy()
    do_second ()
    [...]

# Uruchom go tylko jeśli zostanie wywołany z linii poleceń
jeśli __name__ == '__main__':
    biegać()
# Scale1.py
importuj Skalę 2

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
źródło
2
+1, ponieważ Python jest w stanie to zrobić, będzie to cleanest odpowiedź.
LuWi
1
+1, jest to właściwy sposób robienia tego, czego chce PO i prawdopodobnie powinna to być zaakceptowana odpowiedź.