Alguém pode explicar por que o resultado que desejo, "oi", é precedido pela letra 'b' e seguido por uma nova linha?
Estou usando Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
Este 'b' extra não aparece se eu executá-lo com o python 2.7
python
subprocess
popen
imagineerThat
fonte
fonte
echo hi
imprimehi\r\n
. Para evitar isso, você pode adicionar .strip () no final, ou uma correção semelhante.check_output()
vez de.communicate()
aqui:print(subprocess.check_output("echo hi", shell=True, universal_newlines=True), end="")
Respostas:
O comando echo por padrão retorna um caractere de nova linha
Compare com isto:
print(subprocess.Popen("echo -n hi", \ shell=True, stdout=subprocess.PIPE).communicate()[0])
Quanto ao b que precede a string, ele indica que é uma sequência de bytes que é equivalente a uma string normal em Python 2.6+
http://docs.python.org/3/reference/lexical_analysis.html#literals
fonte
O
b
indica que o que você tem ébytes
uma sequência binária de bytes, em vez de uma string de caracteres Unicode. Subprocessa bytes de saída, não caracteres, então é isso quecommunicate()
está retornando.O
bytes
tipo nãoprint()
pode ser diretamente ativado, então você está sendo mostrado orepr
de quebytes
você tem. Se você souber a codificação dos bytes recebidos do subprocesso, poderá usádecode()
-los para convertê-los em um imprimívelstr
:>>> print(b'hi\n'.decode('ascii')) hi
É claro que este exemplo específico só funciona se você realmente estiver recebendo ASCII do subprocesso. Se não for ASCII, você receberá uma exceção:
>>> print(b'\xff'.decode('ascii')) Traceback (most recent call last): File "<stdin>", line 1, in <module> UnicodeDecodeError: 'ascii' codec can't decode byte 0xff in position 0…
A nova linha é parte do que
echo hi
tem saída.echo
O trabalho de é produzir os parâmetros que você passa, seguido por uma nova linha. Se não estiver interessado em espaços em branco ao redor da saída do processo, você pode usar da seguintestrip()
forma:>>> b'hi\n'.strip() b'hi'
fonte
os.popen
retorna strings de texto, se há uma maneira de fazersubprocess.Popen
também retorná-los, em vez de strings de byte.universal_newlines
que faz com que oPopen
objeto aceite e retorne strings de texto.check_output("dir")
, executar , extrair um nome de arquivo da saída e tentar acessá-lo comopen
falhará se o nome do arquivo contiver tremas alemães. Pode ser um bug.Conforme mencionado antes,
echo hi
realmente retornahi\n
, o que é um comportamento esperado.Mas provavelmente você deseja apenas obter os dados em um formato "correto" e não lidar com a codificação. Tudo que você precisa fazer é passar a
universal_newlines=True
opção desubprocess.Popen()
gostar assim:>>> import subprocess >>> print(subprocess.Popen("echo hi", shell=True, stdout=subprocess.PIPE, universal_newlines=True).communicate()[0]) hi
Desta forma
Popen()
, substituirá esses símbolos indesejados por si só.fonte
universal_newlines=True
funcionou como um encanto. Esta deve ser a resposta aceita, na minha humilde opinião ...universal_newlines=True
emPopen
(para se livrar dob''
) e umstrip()
na cadeia resultante, se você quiser cortar a nova linha de terminação.universal_newlines
agora é apenas um alias compatível com versões anteriores para otext
parâmetro, que é mais claro, mas apenas no Python 3.7 e superior.b é a representação de byte e \ n é o resultado da saída de eco.
A seguir irá imprimir apenas os dados do resultado
import subprocess print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode('utf-8').strip())
fonte