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 バージョンのバイト文字列リテラルを示します。この表記法は、Unicode サポートへの移行に向けたステップとして、Python 2 のPEP 358で導入されました。2.6bの現在のPython 構文はプレフィックスについて言及していませんが、2.7bのPython 構文ではプレフィックスについて言及しています。ただし、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 では、これはバイト リテラルを示します: はい、少なくともバージョン 2.6 以降の Python 2 でも同様です。
  • この表記法は Python 2 では無視されます:すでにそれをサポートしている Python 2 バージョンを持っていて、あなた (またはあなたが見ている外国のコード) をインポートしない限り、そしてあなたが Python 2 との互換性を気にしない場合のみ、それは効果がありません。 Python 3 (誰もが考慮する必要があり、多くの場合、サード パーティ製ソフトウェアで対象とされています)。__future__

私の見解では、OPの質問に対する最短の有効な答えは次のようになります。

これは文字列リテラルのプレフィックスであり、Python 2.6 で導入された Unicode 表現ではなくバイト表現を強制し、Python 2 の Python のデフォルトを変更しませんfrom __future__ import(ただし、見られる場合は注意が必要です)。

于 2013-03-19T08:32:44.337 に答える