Estou tentando fazer uma chamada de sistema em Python e armazenar a saída em uma string que eu possa manipular no programa Python.
#!/usr/bin/python
import subprocess
p2 = subprocess.Popen("ntpq -p")
Eu tentei algumas coisas, incluindo algumas das sugestões aqui:
Recuperando a saída de subprocess.call ()
mas sem sorte.
python
subprocess
Marca
fonte
fonte
"ntpq -p"
, o que é uma parte diferente de o problema do que você está perguntando.Respostas:
No Python 2.7 ou Python 3
Em vez de criar um
Popen
objeto diretamente, você pode usar asubprocess.check_output()
função para armazenar a saída de um comando em uma string:No Python 2.4-2.6
Use o
communicate
métodoout
é o que você quer.Nota importante sobre as outras respostas
Observe como passei no comando. O
"ntpq -p"
exemplo traz outra questão. ComoPopen
não invoca o shell, você usaria uma lista do comando e opções—["ntpq", "-p"]
.fonte
Popen.communicate
não retorna até o processo terminar.p = subprocess.Popen(["ntpq", "-p"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
subprocess.check_output()
retorna umbytes
objeto, não astr
. Se tudo o que você deseja fazer é imprimir o resultado, isso não fará nenhuma diferença. Mas se você quiser usar um método comomyString.split("\n")
o resultado, precisará decodificar obytes
objeto:subprocess.check_output(myParams).decode("utf-8")
por exemplo.universal_newlines=True
como parâmetro me ajudou no Python 3 a obter o objeto string. Se universal_newlines for True, eles serão abertos no modo de texto com codificação padrão. Caso contrário, eles são abertos como fluxos binários.Isso funcionou para mim no redirecionamento do stdout (o stderr pode ser tratado da mesma forma):
Se não funcionar, especifique exatamente o problema que está ocorrendo.
fonte
\n
.pipe.returncode == 0
após a última linha também.Popen
retorna uma tupla destdout
estderr
, portanto, quando você acessa,[0]
está apenas agarrando ostdout
. Você também pode fazertext, err = pipe.communicate()
e, em seguida,text
terá o que você esperaSupondo que
pwd
seja apenas um exemplo, é assim que você pode fazer:Consulte a documentação do subprocesso para outro exemplo e mais informações.
fonte
subprocess.Popen: http://docs.python.org/2/library/subprocess.html#subprocess.Popen
No construtor Popen, se o shell for True , você deve passar o comando como uma string e não como uma sequência. Caso contrário, basta dividir o comando em uma lista:
Se você precisar ler também o erro padrão, na inicialização do Popen, poderá definir stderr como subprocess.PIPE ou subprocess.STDOUT :
fonte
para Python 2.7+, a resposta idiomática é usar
subprocess.check_output()
Você também deve observar a manipulação de argumentos ao chamar um subprocesso, pois pode ser um pouco confuso ....
Se args é apenas um comando sem args próprio (ou você
shell=True
configurou), pode ser uma sequência. Caso contrário, deve ser uma lista.por exemplo ... para chamar o
ls
comando, tudo bem:então é isso:
no entanto, se você quiser passar alguns argumentos para o comando shell, não poderá fazer isso:
em vez disso, você deve passá-lo como uma lista:
a
shlex.split()
função às vezes pode ser útil para dividir uma string em sintaxe semelhante a shell antes de criar um subprocesso ... assim:fonte
Isso funciona perfeitamente para mim:
fonte
Isso foi perfeito para mim. Você receberá o código de retorno, stdout e stderr em uma tupla.
Por exemplo:
fonte
A resposta aceita ainda é boa, apenas algumas observações sobre os recursos mais recentes. Desde o python 3.6, você pode lidar com a codificação diretamente
check_output
, consulte a documentação . Isso retorna um objeto de string agora:No python 3.7, um parâmetro
capture_output
foi adicionado ao subprocess.run (), que faz parte do processamento do Popen / PIPE para nós, consulte os documentos do python :fonte
Nesse caso, você terá apenas um elemento na lista.
fonte
os.popen
foi descontinuado em favor dosubprocess
módulo.Eu escrevi uma pequena função com base nas outras respostas aqui:
Uso:
fonte
No Python 3.7, um novo argumento de palavra-chave
capture_output
foi introduzido parasubprocess.run
. Habilitando o curto e simples:fonte
Esta é uma solução de linha
fonte
O seguinte captura stdout e stderr do processo em uma única variável. É compatível com Python 2 e 3:
Se o seu comando for uma string em vez de uma matriz, prefixe-o com:
fonte
Para python 3.5, eu coloquei a função com base na resposta anterior. O registro pode ser removido, mas é bom ter
fonte
Use o
ckeck_output
método desubprocess
Finalmente analise a string
Espero que ajude, codificação feliz
fonte