9

Python スクリプトに、外部プロセスをセットアップして使用するかどうかを指定するフラグがあります。このプロセスは呼び出されるコマンドmy_commandであり、標準入力からデータを取得します。これをコマンドラインで実行するとしたら、次のようになります。

$ my_command < data > result

dataPython スクリプトを使用して、標準入力を変更して にフィードすることにより、の行を生成したいと考えていますmy_command

私はこのようなことをしています:

import getopt, sys, os, stat, subprocess

# for argument's sake, let's say this is set to True for now
# in real life, I use getopt.getopt() to decide whether this is True or False
useProcess = True

if useProcess:
    process = subprocess.Popen(['my_command'], stdin=subprocess.PIPE, stdout=subprocess.PIPE)

for line in sys.stdin:
    # parse line from standard input and modify it
    # we store the result in a variable called modified_line
    modified_line = line + "foo"

    # if we want to feed modified_line to my_command, do the following:
    if useProcess:
        process.stdin.write(modified_line)

    # otherwise, we just print the modified line
    else:
        print modified_line

ただし、my_commandデータを受信しないかのように動作し、エラー状態で終了します。私は何を間違っていますか?

編集

私の Python スクリプトの名前がmy_Python_script. 通常、標準入力を介してmy_command呼び出されるファイルを渡すとしましょう。data

$ my_command < data > result

しかし今、私はmy_Python_script代わりにそれを渡しています:

$ my_Python_script < data > some_other_result

の内容でmy_Python_script実行されるサブプロセスを条件付きで設定したい(に渡される前にによって変更される)。これはもっと理にかなっていますか?my_commanddatamy_Python_scriptmy_command

スクリプト言語として使用bashしていた場合、2 つの関数のいずれかを実行することを条件付きで決定します。データの行を にパイプしmy_commandます。もう一方はそうしません。これは Python で実行できますか?

4

3 に答える 3

10

stdinに書き込んだ後、それを閉じる必要があります。

    process.stdin.write(modified_line)
    process.stdin.close()

アップデート

process.stdin.write()がforループで実行されていることに気づきませんでした。その場合、をprocess.stdin.close()ループの外側に移動する必要があります。

また、レイモンドは私たちも電話するべきだと述べprocess.wait()ました。したがって、更新されるコードは次のようになります。

for ...
    process.stdin.write(modified_line)

process.stdin.close()
process.wait()
于 2013-03-09T01:11:58.890 に答える
3

process.stdin.close()@HaiVu で言及されていることに加えprocess.wait()て、結果を取得する前にコマンドが終了するのを待ちましたか?

于 2013-03-09T02:19:22.903 に答える
0

引数とstdinを混同しているようです。あなたのコマンドは

$ <data> | mycommand result

コマンドが呼び出されると、データが渡されます。

入力の取得は、raw_input組み込み関数を使用して行われます。(http://docs.python.org/2/library/functions.html

于 2013-03-09T00:57:04.420 に答える