example español python subprocess popen

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())