2009-05-25 26 views
53

のPython 2.xでは、私はこれを行うことができます: python 3のstdoutにバイナリデータを書き込む方法は?

import sys, array 
a = array.array('B', range(100)) 
a.tofile(sys.stdout)

は今しかし、私は TypeError: can't write bytes to text streamを取得します。私が使うはずの秘密のコードがありますか?

+3

Python 2.6+および3で動作します答えを見つけるためにはるかに良いでしょう。 x – sorin

+1

'os.write'はPy2とPy3の両方で動作します。 –

答えて

90

良い方法:あなたはまだ以下のようなバイトのコマンドを使用することができますのpython3でエンコードを指定したい場合には

import sys 
sys.stdout.buffer.write(b"some binary data") 
+3

'sys.stdout.buffer'を使うと、ソースファイルオブジェクトが文字列ではなくバイトを与えるときでも、' shutil.copyfileobj'のようなことをすることができます。 +1 – csl

+0

これを使用するプログラムは、IDLE 3でテストすることはできません。 'AttributeError: 'PseudoOutputFile'オブジェクトに 'buffer'属性がありません。 –

+0

IDLEの@DamianYerrick(Windowsでは少なくとも)' pythonw.exe'はIDLEを実行します。 stdoutがないこと。これはtkinterでエミュレートされます。物理的にはバイトを処理できません。この場合、IDLEを使用する代わりに '.decode( 'UTF-8'、errors = 'replace')'文字列を実行するか、 'python3 -I 'を実行してREPLを取得してください。 – Artyer

10
import os 
os.write(1, a.tostring()) 

または、os.write(sys.stdout.fileno(), …)それはあなたのために1よりも読みやすいかどう。

+0

ありがとう、それは働いた。ちょっとハック・アイスだと思うけど、そうするのはそれが普通のことではないと思う。 –

+4

'os.write'の問題は、すべてが書き込まれることを保証するものではないので、戻り値をチェックする必要があるということです。 –

0

1は、対応する通常の数である
import os 
os.write(1,bytes('Your string to Stdout','UTF-8')) 

stdout - > sys.stdout.fileno()の場合

エンコードを気にしない場合は、次のようにします。

import sys 
sys.stdout.write("Your string to Stdout\n") 

あなたは以下を使用しよう、その後、エンコードせずにos.writeを使用する場合:

import os 
os.write(1,b"Your string to Stdout\n") 
+0

'os.write(sys.stdout.fileno()、some_bytes)'を使ったプログラムは、IDLEでは動作しません。 'io.UnsupportedOperation:fileno' –

+0

@DamianYerrick:あなたは正しいです... IDLEは、とにかくそのようなものをテストするために使用されるべきではありません。まもなくIDLE(私はpython3.5.1シェルを持っていました)を開き、単純にsysとsys.stdout.fileno()をインポートしてみましょう。IDLEではこれがサポートされていないので、ioエラーがスローされます:-)常に重要ですどのような環境で作業しているかを覚えて、可能なものを手に入れよう;)これであなたの質問を明確にしたいと思っています:-)良い週末を過ごしてください。 –

関連する問題