3

コマンドライン実行可能ファイル (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」を使用するようにスクリプトを切り替えました。

コーデック モジュールの動作が異なる理由を誰かが説明できる場合は、感謝します。

4

2 に答える 2

1

親の出力チャネルをフラッシュします。

パイプは常にバッファリングされます。通常のバッファ サイズは 4KB です。出力がコンソールに接続されている場合とは異なり、標準ランタイムは各行の後に出力をフラッシュしません。

于 2012-05-11T15:24:08.087 に答える
0

これを試して:

import sys
import os

fd = sys.stdin.fileno()
text = ''
while 1:
    try:
        raw_data = os.read(fd, 1024)
        text += unicode(raw_data, 'iso-8859-1')
        # now do something with text
    except (EOFError, KeyboardInterrupt):
        break

このようにして、ASCII 以外の文字に対してエラーを発行する which の使用を回避しますreadline()が、ノンブロッキング読み取りを使用することはできます。

唯一の問題は、入力を自分で行に分けなければならないことです。

于 2013-01-28T15:13:06.067 に答える