web-dev-qa-db-ja.com

OSError:pythonでprint()を使用すると、生のwrite()が無効な長さを返しました

python tensorflowを使用して、pythonで画像を認識するようにモデルをトレーニングしています。しかし、 github からtrain.pyを実行しようとすると、以下のエラーが発生します

Traceback (most recent call last):
File "train.py", line 1023, in <module>
tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
File "C:\Users\sande\Anaconda3\envs\tensorflow\lib\site-
packages\tensorflow\python\platform\app.py", line 48, in run
_sys.exit(main(_sys.argv[:1] + flags_passthrough))
File "train.py", line 766, in main
bottleneck_tensor)
File "train.py", line 393, in cache_bottlenecks
jpeg_data_tensor, bottleneck_tensor)
File "train.py", line 341, in get_or_create_bottleneck
bottleneck_tensor)
File "train.py", line 290, in create_bottleneck_file
print('Creating bottleneck at ' + bottleneck_path)
OSError: raw write() returned invalid length 112 (should have been between 0 
and 56)

以下はcreate_bottleneck_file()のコードです

def create_bottleneck_file(bottleneck_path, image_lists, label_name, index,
                       image_dir, category, sess, jpeg_data_tensor,
                       bottleneck_tensor):
"""Create a single bottleneck file."""
print('Creating bottleneck at ' + bottleneck_path)
image_path = get_image_path(image_lists, label_name, index,
                          image_dir, category)
if not gfile.Exists(image_path):
    tf.logging.fatal('File does not exist %s', image_path)
image_data = gfile.FastGFile(image_path, 'rb').read()
try:
    bottleneck_values = run_bottleneck_on_image(
        sess, image_data, jpeg_data_tensor, bottleneck_tensor)
except:
    raise RuntimeError('Error during processing file %s' % image_path)

bottleneck_string = ','.join(str(x) for x in bottleneck_values)
with open(bottleneck_path, 'w') as bottleneck_file:
    bottleneck_file.write(bottleneck_string)

Bottleneck_pathが小さな値になるようにファイル名を減らしてみましたが、機能しませんでした。このエラーをオンラインで検索しようとしたが、何も役に立たなかった。この問題を修正するかどうかをお知らせください

8
sandywho

3.6に、または私のようなWindowsから移行できない場合は、win_unicode_consoleパッケージをインストールしてインポートし、この行をスクリプトの冒頭に追加しますそれを有効にする:

win_unicode_console.enable()

テキスト出力の処理を担当するコードがこの最新バージョン用に書き直されたため、この問題は一般に3.6より前のバージョンに固有のようですPythonこの問題。

ソース: https://bugs.python.org/issue32245

12
AMSantiago

これは、11月のクリエーターアップデートによって導入されたstdout/stderrストリームのバグだと思います。powershell.exeとcmd.exeの両方で発生します

Windows 10バージョン1709(OSビルド16299.64)でのみ発生するようです。私の推測では、それはユニコードで実現されています(出力サイズはtwice予想される長さです)

(非常に)速くて汚い修正は、コンソールにASCIIのみを出力することです:

mystring.encode("utf-8").decode("ascii")

https://github.com/Microsoft/vscode/issues/39149#issuecomment-347260954

10
Lliane

@AMSAntiagoの回答にさらに追加します。 win_unicode_console.enable()を実行できます。しかし、すべてのファイルで使用する代わりに、すべてのPython呼び出し( docs )で実行できます。

3
Rama Jakaria