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)

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


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


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 ()

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ź.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.