Python Script executa comandos no Terminal

109

Eu li isso em algum lugar há um tempo, mas não consigo encontrar. Estou tentando encontrar um comando que execute comandos no terminal e, em seguida, produza o resultado.

Por exemplo: o script será:

command 'ls -l'

Vai sair o resultado da execução desse comando no terminal

Todos
fonte

Respostas:

198

Existem várias maneiras de fazer isso:

Uma maneira simples é usar o módulo de sistema operacional:

import os
os.system("ls -l")

Coisas mais complexas podem ser alcançadas com o módulo de subprocesso: por exemplo:

import subprocess
test = subprocess.Popen(["ping","-W","2","-c", "1", "192.168.1.70"], stdout=subprocess.PIPE)
output = test.communicate()[0]
Uku Loskit
fonte
43
Eu não quero menosprezar você, mas. Você deve usar subprocesso para tudo. É muito mais seguro. subprocess.call () obterá uma interface agradável para substituir o formulário de chamada simples.
Jorge Vargas
Obrigado por essa resposta companheiro. Usarei python para meu primeiro aplicativo no desktop Ubuntu, isso vai realmente me ajudar.
LinuxBill
1
Como posso obter a resposta completa de um comando, os.system("nslookup gmail.com")retorna apenas a última linha 0, mas quero obter a resposta completa.
Parthapratim Neog
3
@JorgeVargas Você pode me ajudar a entender porque o subprocesso deve ser usado para tudo? Por que é mais seguro?
Soutzikevich
38

Eu prefiro o uso do módulo de subprocesso:

from subprocess import call
call(["ls", "-l"])

A razão é que se você deseja passar alguma variável no script, isso é uma maneira muito fácil, por exemplo, pegue a seguinte parte do código

abc = a.c
call(["vim", abc])
Kevin Pandya
fonte
Funcionou bem para abrir uma imagem com parâmetros extrascall(["eog", "1breeproposal.png", "-f"])
Josh
4

Você também deve olhar para commands.getstatusoutput

Isso retorna uma tupla de comprimento 2 .. O primeiro é o inteiro de retorno (0 - quando os comandos são bem-sucedidos), o segundo é toda a saída, como será mostrado no terminal.

Para ls

    import commands
    s=commands.getstatusoutput('ls')
    print s
    >> (0, 'file_1\nfile_2\nfile_3')
    s[1].split("\n")
    >> ['file_1', 'file_2', 'file_3']
minocha
fonte
2
import os
os.system("echo 'hello world'")

Isso deve funcionar. Não sei como imprimir a saída no shell python.

Mr_pzling_Pie
fonte
1

O os.popen () é muito simples de usar, mas está obsoleto desde o Python 2.6. Você deve usar o subprocesso módulo de .

Leia aqui: lendo um os.popen (comando) em uma string

Paolo Rovelli
fonte
1

Jupyter

Em um notebook Jupyter você pode usar a função mágica !

!echo "execute a command"
files = !ls -a /data/dir/ #get the output into a variable

ipython

Para executar isso como um .pyscript, você precisa usaripython

files = get_ipython().getoutput('ls -a /data/dir/')

executar script

$ ipython my_script.py
Zephro
fonte
0

Você pode importar o módulo 'os' e usá-lo assim:

import os
os.system('#DesiredAction')
Kobe Keirouz
fonte
0

para python3 use subprocesso

import subprocess
s = subprocess.getstatusoutput(f'ps -ef | grep python3')
print(s)
Avi Avidan
fonte