Quero atribuir a saída de um comando que eu corro usando os.system
a uma variável e impedir que ela seja exibida na tela. Mas, no código abaixo, a saída é enviada para a tela e o valor impresso var
é 0, o que eu acho que significa se o comando foi executado com êxito ou não. Existe alguma maneira de atribuir a saída do comando à variável e também impedir que ela seja exibida na tela?
var = os.system("cat /etc/services")
print var #Prints 0
os.system
(nemos.popen
, de acordo com a resposta que você aceitou): usesubprocess.Popen
, é muito melhor!subprocess.Popen
- basta adicionarshell=True
!shell=True
é (geralmente) uma péssima idéia! Você tem que estar muito certo de que você está executando :)Respostas:
Do " Equivalente ao Bash Backticks no Python ", que perguntei há muito tempo, o que você pode querer usar é
popen
:Nos documentos do Python 3.6 ,
Aqui está o código correspondente para
subprocess
:fonte
subprocess.check_output
solução de Walter está mais próxima da linha Pythonic que parece que você está procurando, desde que não se importestderr
.os.popen
?shell=True
. Veja docs.python.org/3/library/…shell=True
, como também está incorreto neste caso.shell=True
faz a desembolsar o processo filho, em vez decat
, por isso,out
eerr
são o stdout / stderr do shell processo e não docat
processoVocê também pode querer olhar para o
subprocess
módulo, que foi criado para substituir toda a família depopen
chamadas do tipo Python .A vantagem é que há muita flexibilidade na maneira como você chama os comandos, onde os fluxos de entrada / saída / erro padrão estão conectados etc.
fonte
check_output
foi adicionado com o python 2.7 docs.python.org/2.7/library/…stderr=subprocess.STDOUT
para capturar erros padrão bemO módulo de comandos é uma maneira razoavelmente de alto nível para fazer isso:
status é 0, saída é o conteúdo de / etc / services.
fonte
Para python 3.5+, é recomendável usar a função run do módulo de subprocesso . Isso retorna um
CompletedProcess
objeto, do qual você pode obter facilmente a saída e o código de retorno. Como você está interessado apenas na saída, é possível escrever um wrapper de utilitário como este.fonte
Sei que isso já foi respondido, mas eu queria compartilhar uma maneira potencialmente mais atraente de ligar para o Popen através do uso de
from x import x
e funções:fonte
cmd.py
e, em seguida, no meu arquivo principal, escrevifrom cmd import cmdline
e o usei conforme necessário.eu faço isso com o arquivo temporário os.system:
fonte
Python 2.6 e 3 dizem especificamente para evitar o uso do PIPE para stdout e stderr.
A maneira correta é
fonte