コマンドライン実行可能ファイル (childprogram) 用の Python ラッパー スクリプト (childscript.py) を作成しています。別の実行可能ファイル (parentprogram) は、childscript.py を生成し、出力を childscript.py にパイプします。childscript.py は次のように childprogram を生成します:
retval = subprocess.Popen(RUNLINE, shell=False, stdout=None, stderr=None, stdin=subprocess.PIPE)
childscript.py が readline を使用して sys.stdin から一連の読み取りを行う場合:
line = sys.stdin.readline()
親プログラムからすべての出力を取得して、子プログラムにフィードすることができます。
ただし、次のようにして codecs モジュールを使用しようとすると:
sys.stdin = codecs.open(sys.stdin.fileno(), encoding='iso-8859-1', mode='rb', buffering=0)
または次のことを行います。
sys.stdin = codecs.getreader('iso-8859-1')(sys.stdin.detach())
読み取りを実行しようとすると、読み取りは親プログラムからのすべての出力を取得しません。parentprogram から追加の出力を強制すると、プッシュした追加の出力の一部と一緒に不足しているビットが出てきます。 codecs モジュールを使用すると、childscript.py が提供されているものすべてを読み取っていないようです。
私は何か完全に間違っていますか?コーデックがないと、parentprogram からの iso-8859-1 でエンコードされたものが提示されると、childscript.py は例外をトリガーします。
編集:
Python v3.x の "open" もエンコード オプションを使用できることがわかりました。「codecs.open」の代わりに「open」を使用するように行を変更しました。
sys.stdin = open(sys.stdin.fileno(), encoding='iso-8859-1', mode='r')
open.codecs が引き起こす問題もなく、期待どおりに動作します。代わりに「open」を使用するようにスクリプトを切り替えました。
コーデック モジュールの動作が異なる理由を誰かが説明できる場合は、感謝します。