python - español - ¿Por qué Popen.communicate() devuelve b''hi / n ''en lugar de'' hola ''?
subprocess python 3 example (4)
Como se mencionó anteriormente, echo hi
realmente devuelve hi/n
, que es un comportamiento esperado.
Pero probablemente solo desee obtener los datos en un formato "correcto" y no tratar con la codificación. Todo lo que necesita hacer es pasar universal_newlines=True
opción universal_newlines=True
a subprocess.Popen()
así:
>>> import subprocess
>>> print(subprocess.Popen("echo hi",
shell=True,
stdout=subprocess.PIPE,
universal_newlines=True).communicate()[0])
hi
De esta forma, Popen()
reemplazará estos símbolos no deseados por sí mismo.
¿Alguien puede explicar por qué el resultado que quiero, "hola", está precedido por una letra "b" y seguido por una nueva línea?
Estoy usando Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b''hi/n''
Esta ''b'' extra no aparece si la ejecuto con Python 2.7
El comando echo devuelve por defecto un carácter de nueva línea
Compare esto:
print(subprocess.Popen("echo -n hi", /
shell=True, stdout=subprocess.PIPE).communicate()[0])
En cuanto a la b que precede a la cadena, indica que se trata de una secuencia de bytes que es equivalente a una cadena normal en Python 2.6+
http://docs.python.org/3/reference/lexical_analysis.html#literals
La b
indica que lo que tienes son bytes
, que es una secuencia binaria de bytes en lugar de una cadena de caracteres Unicode. Los subprocesos generan bytes, no caracteres, así que eso es lo que communicate()
.
El tipo de bytes
no es directamente print()
, por lo que se le muestra la repr
de los bytes
que tiene. Si conoce la codificación de los bytes que recibió del subproceso, puede usar decode()
para convertirlos en una str
imprimible:
>>> print(b''hi/n''.decode(''ascii''))
hi
Por supuesto, este ejemplo específico solo funciona si realmente está recibiendo ASCII del subproceso. Si no es ASCII, obtendrá una excepción:
>>> 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…
La nueva línea es parte de lo que echo hi
ha generado. El trabajo de echo
es dar salida a los parámetros que se pasan, seguidos de una nueva línea. Si no le interesan los espacios en blanco que rodean la salida del proceso, puede usar strip()
manera:
>>> b''hi/n''.strip()
b''hi''
b es la representación de bytes y / n es el resultado de la salida de eco.
A continuación, solo se imprimirán los datos de resultado
import subprocess
print(subprocess.Popen("echo hi", shell=True,stdout=subprocess.PIPE).communicate()[0].decode(''utf-8'').strip())