2009-04-04 9 views
1

私はPythonのサブプロセスに非常に奇妙な問題があります。私はそれを使用していくつかの外部exeを呼び出して、リストに出力を保持します。Pythonのサブプロセス.Popenは同じ標準出力を返しません。

この外部exeを呼び出すたびにの別の文字列が返されます。しかし、Popenを使って何度も呼び出すと、は同じ文字列を返します。 =: - O

Popenがexeを呼び出さずに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! 

+0

C_KEY_MAKERコマンドをコマンドラインで直接実行すると、何が生成されますか? –

+0

期待どおり2つの異なる文字列。 – cfischer

+0

@フェルナンド:実際は私には期待されていません。私は、コマンドラインアプリに適切な乱数の種があることに疑いを持っています。サブプロセスとコマンドラインバージョンの間には、環境変数の違いがいくつか存在する必要があります。 –

答えて

3

ことが可能です(C_KEY_MAKERさんランダムであればビヘイビアは現在の時間(秒単位)に基づいています。これは、コマンドラインで2回実行すると、実行間で時間が変わって別の出力が得られますが、Pythonを実行すると2回実行されます時間が変わらず、同じ値を2回続けて返すような素早い継承。

1

何もありません。それは私の独自のテストで(下のインデントのエラーを除いて)うまくいきます。問題はあなたのexeのいずれかです。または他の場所。

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

そして、変更された間に合わプログラムが一番下にインデントの問題を取り除くために、そしてtfile.py呼び出すためにtfile.py明確にする

は、私はPythonプログラムを作成しました。それは2つの異なる結果をもたらしました。

+0

私はWindows上で動作していますが、それは問題でしょうか? – cfischer

+0

それは可能ですが、私はそれを疑っています。このような例を自分で実行して、奇妙なことが起こっていないかどうかを確認することができますが、これはサブプロセスモジュールの重大なバグです。LinuxとWindowsでは同じように動作するはずです。 –

0

あなたのコードは実行可能なものではありませんので、あなたを助けるのは難しいです。字下げや構文を修正し、それを自己完結型にすることを考えてください。

Linuxでは、Devin Jeanpierreによるとうまくいくようです。

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 
関連する問題