¿Cómo ejecuto un comando de línea de comando en un script de Python?

16

Estoy usando 2 scripts separados, Scale1.pyy Scale2.py. Para ejecutarlos entro sudo python Scale1.pyo sudo python Scale2.pydesde la línea de comando de la terminal. Me gustaría tener una línea en el Scale2.pyscript en la que si presiono un botón, el programa se rompe y se ejecuta Scale1.py. Algo como esto, que no funciona.

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

Respuestas:

24

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

primero deberá importar el módulo os

import os

No tengo un pi conmigo para probar, pero esto viene de la segunda respuesta a esta pregunta: /programming/89228/calling-an-external-command-in-python

mrwhale
fuente
Esto es lo que probé y funcionó, ¡muchas gracias Harry! Pero tuve que combinar ambos programas primero. Ahora el sistema os.system ("sudo python Scale3.py") simplemente se reinicia al comienzo del programa Scale3.py, lo cual está bien. Creo que importar Scale3.py también funcionará. No probé el subproceso, parece interesante y probablemente sea algo que necesito aprender.
Rico
os.system()ha sido depricated a favor de subprocess, ver stackoverflow.com/a/4256153/4212158
crypdick
11

En general, use el módulo de subproceso

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

para llamadas de línea de comando.

Un ejemplo que procesa el resultado de una llamada de subproceso;

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

El subproceso reemplaza varios módulos y funciones anteriores, como os.system y os.spawn . Hace un buen trabajo al desinfectar los argumentos, por lo que lo protege de la inyección de conchas .

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

Por supuesto, para ejecutar un segundo script de Python no hay necesidad de una llamada CLI, puede importarlos.

Janghou
fuente
Estoy tratando de aprender a emitir comandos desde un script de Python (ver aquí y aquí ) y tengo algunos problemas. Me pregunto si subprocesspodría ser mejor en mi caso también.
uhoh
6

Puede usar sudo como sugirió harry sib, pero tendría que agregar el usuario que ejecuta el primer script al archivo sudoers .

La mejor manera de ejecutar un script de Python desde otro script de Python es importarlo. Debe tener la lógica de su script en un método en el segundo script:

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

# Ejecútelo solo si se llama desde la línea de comando
if __name__ == '__main__':
    correr()
# Scale1.py
Importar Scale2

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
fuente
2
+1, ya que Python es capaz de hacer esto, será la cleanestrespuesta.
LuWi
1
+1, esta es la forma correcta de hacer lo que quiere el OP y probablemente debería ser la respuesta aceptada.