6

假设我有一个返回一堆行的过程,我想对其进行迭代:

import subprocess

myCmd = ['foo', '--bar', '--baz']
myProcess = subprocess.Popen(myCmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for myLine in iter(myProcess.stdout.readline, b''):
    print myLine

iter()在这个例子中,我将值传递给它的哨兵参数做b''什么?我想我自己理解''——我停止在空行上迭代——但我不知道是什么b''意思。

4

2 回答 2

4

在 python3 中,字符串是一个字节文字。在 python 2 中被忽略。

于 2013-03-19T07:45:35.443 回答
4

我会尽力比我目前所读的更精确。(略有修改的版本)

Python 表示法b'string'表示支持它的 Python 版本中的字节字符串文字。Python 2 的PEP 358引入了该表示法,作为向 unicode 支持迁移的一步。当前2.6 的 Python 语法没有提到bprefix2.7 的 Python 语法确实提到了bprefix。但是,PEP 358 是为 Python 2.6 设计的,我见过的所有 Python 2.6 解释器都接受它。

随着向 Python 3 的迁移,字符串文字的默认值byte更改为unicode。但是,引入该__future__模块是为了简化迁移。下面说明了字符串文字的效果。

Python 2.6.6 (r266:84292, Dec 26 2010, 22:31:48) 
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> 'abc'
'abc'
>>> b'abc'
'abc'
>>> from __future__ import unicode_literals
>>> 'abc'
u'abc'
>>> b'abc'
'abc'

我希望我能激发以下陈述的有效性:

  • 在 Python 3 中,这表示一个字节文字:是的,但在 Python 2 中至少从 2.6 版开始也是如此。
  • 这个符号在 Python 2 中被忽略如果你有一个已经支持它的 Python 2 版本并且除非你(或你看到的外部代码)导入__future__ 并且只有当你不关心与Python 3(每个人都应该考虑,并且通常针对第三方软件)。

在我看来,对 OP 问题的最短有效答案是:

这是字符串文字的前缀,强制字节表示而不是 unicode 表示,在 Python 2.6 中引入,不会更改 Python 2 的 Python 默认值from __future__ import(但如果可以看到,则值得关注)。

于 2013-03-19T08:32:44.337 回答