[解決済み】Python 3 TypeError: sys.stdout.write() で bytes でなく str でなければならない。)
質問
Pythonスクリプトから外部プロセスを実行し、実行中にそのstdoutメッセージを表示する方法を探していました。
以下のコードは動作しますが、実行時に標準出力は出力されません。終了時に以下のエラーが発生します。
sys.stdout.write(nextline) TypeError:must be str,not bytes
p = subprocess.Popen(["demo.exe"],stdout = subprocess.PIPE, stderr= subprocess.PIPE)
# Poll process for new output until finished
while True:
nextline = p.stdout.readline()
if nextline == '' and p.poll() != None:
break
sys.stdout.write(nextline)
sys.stdout.flush()
output = p.communicate()[0]
exitCode = p.returncode
Python 3.3.2を使っています。
解決方法は?
Python 3は文字列の扱いが少し変わっています。元々、文字列の型は
の文字列があります。
str
. 90 年代にユニコードが普及すると、新しい
unicode
タイプ
は、既存のコードを壊さずに Unicode を処理するために追加されました。
1
. これは
と事実上同じです。
str
が、マルチバイトに対応している。
Python 3では、2種類のタイプがあります。
-
は
bytes
型を使用します。これは単なるバイト列であり、Pythonは以下のことを知りません。 これを文字として解釈する方法については、何もありません。 -
は
str
型を使用します。これもバイト列である。 が、Pythonは これらのバイトは文字として解釈されます。 . -
を使用することで、個別の
unicode
型は廃止されました。str
が unicode に対応しました。
Python 2 では、暗黙のうちにエンコーディングを仮定することは多くの問題を引き起こします。
間違ったエンコーディングを使用してしまったり、データにエンコーディングがない場合もあります。
を使用することができます(例:PNG画像)。
Pythonにどのエンコーディングを使用するかを明示的に指示する(あるいは明示的に
を推測すること)は、多くの場合、より良い方法であり、"Python philosophy"に沿ったものであると言えます。
の哲学に沿ったものです。
暗黙の了解より明示の方が良い
となります。
この変更は、多くの戻り値が変更されたため、Python 2と互換性がありません。
このような微妙な問題を引き起こすことがあります。
Python 3 の導入は非常に遅れています。Pythonは静的型付けを持たないので
2
のような)スクリプトで自動的に変更することは不可能です。
2to3
).
-
を変換することができます。
str
からbytes
とbytes('h€llo', 'utf-8')
これは を生成します。b'H\xe2\x82\xacllo'
. 1文字が3文字に変換されたことに注意してください。 バイトになります。 -
を変換することができます。
bytes
からstr
とb'H\xe2\x82\xacllo'.decode('utf-8')
.
もちろん、UTF-8はあなたのケースでは正しい文字セットではないかもしれません。 は正しいものを使用してください。
あなたの具体的なコードの一部で
nextline
は
bytes
でなく
str
,
読み
stdout
と
stdin
から
subprocess
は、Python 3 で次のように変更されました。
str
から
bytes
. これは、Pythonがどのエンコーディングを使っているかを確認できないからです。これは
おそらく
と同じものを使用します。
sys.stdin.encoding
(あなたのシステムのエンコーディング)。
が、確実ではありません。
置き換える必要があります。
sys.stdout.write(nextline)
を使っています。
sys.stdout.write(nextline.decode('utf-8'))
とか、あるいは
sys.stdout.write(nextline.decode(sys.stdout.encoding))
を変更する必要があります。
if nextline == ''
から
if nextline == b''
からです。
>>> '' == b''
False
また Python 3 ChangeLog , PEP 358 および PEP 3112 .
1
ASCIIでは、マルチバイト文字セットではできない巧妙なトリックがあります。最も有名な例は、"スペースによる大文字小文字の切り替え"(例.
chr(ord('a') ^ ord(' ')) == 'A'
やquot;6番目のビットをセットして制御文字にするquot;(例.
ord('\t') + ord('@') == ord('I')
). ASCIIは、個々のビットを操作することがパフォーマンスに無視できない影響を与える操作であった時代に設計されました。
2 はい、関数アノテーションは使えますが、比較的新しい機能なので、ほとんど使われていません。
関連
-
[解決済み】ImportError: sklearn.cross_validation という名前のモジュールがない。
-
[解決済み】 NameError: グローバル名 'xrange' は Python 3 で定義されていません。
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】Python elifの構文が無効です【終了しました
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】pip install mysql-python は EnvironmentError: mysql_config not found で失敗します。
-
[解決済み] pipでPythonの全パッケージをアップグレードする方法
-
[解決済み] virtualenvで異なるバージョンのPythonを使用する
-
[解決済み] Python 3で文字列をバイトに変換する最良の方法?
-
[解決済み] TypeError: Python3でファイルへの書き込み時に'str'ではなくbytesのようなオブジェクトが要求される
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
python string splicing.join()とsplitting.split()の説明
-
pythonサイクルタスクスケジューリングツール スケジュール詳解
-
パッケージングツールPyinstallerの使用と落とし穴の回避
-
[解決済み】DataFrameのコンストラクタが正しく呼び出されない!エラー
-
[解決済み】Django: ImproperlyConfigured: SECRET_KEY 設定は空であってはならない
-
[解決済み] builtins.TypeError: strでなければならない、bytesではない
-
[解決済み】インポートエラー。モジュール名 urllib2 がない
-
[解決済み】Python Error: "ValueError: need more than 1 value to unpack" (バリューエラー:解凍に1つ以上の値が必要です
-
[解決済み] TypeError: 'DataFrame' オブジェクトは呼び出し可能ではない
-
[解決済み】サブプロセスコマンドからのライブ出力