Como executo um comando de linha de comando em um script Python?

16

Estou usando 2 scripts separados Scale1.pye Scale2.py. Para executá-los, eu entro sudo python Scale1.pyou sudo python Scale2.pyna linha de comando do terminal. Eu gostaria de ter uma linha no Scale2.pyscript em que, se eu pressionar um botão, o programa seja interrompido e executado Scale1.py. Algo assim, que não funciona.

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

Respostas:

24

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

primeiro você precisará importar o módulo OS

import os

Eu não tenho um pi comigo para testar, mas isso vem da segunda resposta a esta pergunta: /programming/89228/calling-an-external-command-in-python

mrwhale
fonte
Isto é o que eu tentei e funcionou, muito obrigado Harry! Mas eu tive que combinar os dois programas primeiro. Agora o os.system ("sudo python Scale3.py") simplesmente reinicia no início do programa Scale3.py, o que é bom. Eu acho que a importação Scale3.py também funcionará. Não tentei o subprocesso, parece interessante e provavelmente é algo que preciso aprender.
25314 Rico
os.system()foi privado em favor de subprocess, consulte stackoverflow.com/a/4256153/4212158
crypdick
11

Em geral, use o módulo de subprocesso

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

para chamadas de linha de comando.

Um exemplo de processamento do resultado de uma chamada de subprocesso;

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

O subprocesso substitui vários módulos e funções mais antigos, como os.system e os.spawn . Ele faz um bom trabalho na limpeza de argumentos, para protegê-lo da injeção de shell .

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

Obviamente, para executar um segundo script python, não há necessidade de chamada da CLI, você pode importá-los.

Janghou
fonte
Estou tentando aprender a emitir comandos de dentro de um script Python (veja aqui e aqui ) e tendo alguns problemas. Gostaria de saber se subprocesspoderia ser melhor no meu caso também.
uhoh
6

Você pode usar o sudo como sugerido por harry sib, mas seria necessário adicionar o usuário executando o primeiro script ao arquivo sudoers .

A melhor maneira de executar um script python a partir de outro script python é importá-lo. Você deve ter a lógica do seu script em um método no segundo script:

# Scale2.py
def run ():
    faça primeiro()
    do_second ()
    [...]

# Execute-o apenas se for chamado a partir da linha de comando
se __name__ == '__main__':
    corre()
# Scale1.py
importar Scale2

if (GPIO.input (23) == False):
    Scale2.run ()
Gagaro
fonte
2
+1, Como o python é capaz disso, será a cleanestresposta.
LuWi
1
+1, esta é a maneira correta de fazer o que o OP deseja e provavelmente deve ser a resposta aceita.