1

Python の subprocess.Popen で非常に奇妙な問題が発生しています。私はそれを使用して外部exeを数回呼び出し、出力をリストに保持しています。

この外部 exe を呼び出すたびに、異なる文字列が返されます。ただし、Popen を使用して何度か呼び出すと、常にSAME string が返されます。=:-O

exeをリコールせずに、Popenがstdoutから常に同じ値を返しているようです。実際にexeを再度呼び出さずに、ある種のキャッシュを実行している可能性があります。

これは私のコードです:

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    process = Popen(args, stdout=PIPE)
    output = process.communicate()[0].strip()
    return output

if __name__ == '__main__':
    print get_key() # Returns a certain string
    print get_key() # Should return another string, but returns the same!

いったい私は何を間違っているのでしょうか?!

4

4 に答える 4

3

C_KEY_MAKERのランダムな動作が秒単位の現在の時間に基づいている場合、または同様の場合、コマンドラインで 2 回実行すると、実行間で時間が変更され、別の出力が得られる可能性がありますが、python の場合それを実行すると、時間が変わらないほど素早く連続して2回実行されるため、同じ値が2回続けて返されます。

于 2009-07-14T11:08:41.660 に答える
1

あなたの例で何が問題なのかわかりません。この動作を再現することはできませんが、より実践的なアプローチを試してください。

def get_key():

    from subprocess import Popen, PIPE

    args = [C_KEY_MAKER, '/26', USER_NAME, ENCRYPTION_TEMPLATE, '0', ]
    output = Popen(args, stdout=PIPE).stdout
    data = output.read().strip()
    output.close()
    return data
于 2009-04-04T23:38:53.090 に答える
1

何もない。私自身のテストでは、それはうまくいきます(一番下のインデントエラーは別として)。問題はあなたのexeにあります。または他の場所。

明確にするために、pythonプログラムtfile.pyを作成しました

cat > tfile.py
#!/usr/bin/env python
import random
print random.random()

次に、プログラムを変更して、下部のインデントの問題を取り除き、 tfile.py を呼び出すようにしました。それは2つの異なる結果をもたらしました。

于 2009-04-04T13:59:45.243 に答える
0

あなたのコードはそのままでは実行できないので、あなたを助けるのは難しいです。インデントと構文を修正し、自己完結型にすることを検討して、試してみてください。

Devin Jeanpierre によると、Linux では問題なく動作するようです。

于 2009-04-04T14:10:51.550 に答える