111

私が望む結果「こんにちは」の前に文字「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」は表示されません

4

4 に答える 4

109

は、Unicode 文字の文字列ではなく、バイナリ シーケンスのバイトであることbを示します。bytes文字ではなく出力バイトをサブプロセスするため、それcommunicate()が返されます。

bytesタイプは直接使用できないためprint()、持っている の が表示されてreprbytesます。サブプロセスから受け取ったバイトのエンコーディングがわかっている場合は、 を使用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'
于 2013-03-12T23:33:50.767 に答える
25

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

于 2013-03-12T23:32:17.663 に答える