Come posso eseguire un comando da riga di comando in uno script Python?


16

Sto usando 2 script separati Scale1.pye Scale2.py. Per eseguirli entro sudo python Scale1.pyo sudo python Scale2.pydalla riga di comando del terminale. Vorrei avere una riga nello Scale2.pyscript in cui se premo un pulsante, il programma si interrompe e viene eseguito Scale1.py. Qualcosa del genere, che non funziona.

if GPIO.input(23) == False:
    break(sudo python Scale1.py)

Risposte:


24

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

per prima cosa dovrai importare il modulo os

import os

Non ho un pi con me atm per testare, ma questo deriva dalla seconda risposta a questa domanda: /programming/89228/calling-an-external-command-in-python


Questo è quello che ho provato e ha funzionato, grazie mille Harry! Ma prima dovevo combinare entrambi i programmi. Ora os.system ("sudo python Scale3.py") si riavvia semplicemente all'inizio del programma Scale3.py, il che va bene. Penso che funzionerà anche import Scale3.py. Non ho provato il sottoprocesso, sembra interessante ed è probabilmente qualcosa che devo imparare.
Rico,

os.system()è stato depricated a favore di subprocess, vedere stackoverflow.com/a/4256153/4212158
crypdick

11

In generale, utilizzare il modulo sottoprocesso

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

per chiamate dalla riga di comando.

Un esempio che elabora il risultato di una chiamata di sottoprocesso;

 result = subprocess.check_output(['sudo','service','mpd','restart'])

Il sottoprocesso sostituisce diversi moduli e funzioni precedenti, come os.system e os.spawn . Fa un buon lavoro nella sanificazione degli argomenti, quindi ti protegge dall'iniezione di shell .

https://docs.python.org/2/library/subprocess.html

Naturalmente per eseguire un secondo script Python non è necessaria la chiamata alla CLI, è possibile importarli.


Sto cercando di imparare come emettere comandi all'interno di uno script Python (vedi qui e qui ) e riscontrando alcuni problemi. Mi chiedo se subprocesspotrebbe essere migliore anche nel mio caso.
uho

6

Puoi usare sudo come suggerito da harry sib, ma dovresti aggiungere l'utente che esegue il primo script al file sudoers .

Il modo migliore per eseguire uno script Python da un altro script Python è importarlo. Dovresti avere la logica del tuo script in un metodo nel secondo script:

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

# Eseguilo solo se chiamato dalla riga di comando
se __name__ == '__main__':
    correre()
# Scale1.py
importare Scale2

if (GPIO.input (23) == False):
    Scale2.run ()

2
+1, poiché python è in grado di farlo, sarà la cleanestrisposta.
LuWi

1
+1, questo è il modo corretto di fare ciò che l'OP vuole e probabilmente dovrebbe essere la risposta accettata.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.