有人可以解释为什么我想要的结果“ hi”以字母“ b”开头并以换行符结尾吗?
我正在使用Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
如果我使用python 2.7运行此额外的“ b”,则不会出现
有人可以解释为什么我想要的结果“ hi”以字母“ b”开头并以换行符结尾吗?
我正在使用Python 3.3
>>> import subprocess
>>> print(subprocess.Popen("echo hi", shell=True,
stdout=subprocess.PIPE).communicate()[0])
b'hi\n'
如果我使用python 2.7运行此额外的“ b”,则不会出现
echo hi
prints hi\r\n
。为避免这种情况,您可以在末尾添加.strip()或类似的修补程序。
check_output()
代替.communicate()
:print(subprocess.check_output("echo hi", shell=True, universal_newlines=True), end="")
Answers:
默认情况下,echo命令返回换行符
与此比较:
print(subprocess.Popen("echo -n hi", \
shell=True, stdout=subprocess.PIPE).communicate()[0])
至于字符串前面的b,则表明它是一个字节序列,等效于Python 2.6+中的常规字符串
http://docs.python.org/3/reference/lexical_analysis.html#literals
在b
表明您拥有的是bytes
,这是一个字节的二进制序列,而不是Unicode字符的字符串。子过程输出字节,而不是字符,因此communicate()
返回的是字节。
该bytes
类型不是直接print()
能,所以你正在显示repr
的bytes
你。如果您知道从子流程接收到的字节的编码,则可以使用decode()
将其转换为可打印的字节str
:
>>> print(b'hi\n'.decode('ascii'))
hi
当然,仅当您实际上是从子流程接收ASCII时,此特定示例才有效。如果不是ASCII,则会出现异常:
>>> 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…
换行符是echo hi
输出内容的一部分。 echo
的工作是输出您传递的参数,然后输出换行符。如果您对流程输出周围的空白不感兴趣,则可以这样使用strip()
:
>>> b'hi\n'.strip()
b'hi'
os.popen
返回文本字符串时,是否有一种方法subprocess.Popen
也可以返回它们,而不是字节字符串。
universal_newlines
它使Popen
对象接受并返回文本字符串。
check_output("dir")
,open
如果文件名包含德语变音符号,则从输出中提取文件名然后尝试使用进行访问将失败。可能是个错误。
如前所述,echo hi
实际上确实会返回return hi\n
,这是预期的行为。
但是您可能只想以“正确”的格式获取数据,而不处理编码。您需要做的就是通过universal_newlines=True
选项,subprocess.Popen()
这样:
>>> import subprocess
>>> print(subprocess.Popen("echo hi",
shell=True,
stdout=subprocess.PIPE,
universal_newlines=True).communicate()[0])
hi
这种方式Popen()
将自己替换这些不需要的符号。
universal_newlines=True
像魅力一样运作。在我的拙见中,这应该是公认的答案...
universal_newlines=True
在Popen
(摆脱的b''
)和一个strip()
上生成的字符串,如果你想砍终止换行符。