2011-05-25 9 views
1

私はPythonの初心者です。私は最近、プロセスが長い時間を必要とするコンソールexeを呼び出すためにPythonスクリプトを使用しようとしました。私はexeがCPUが許すことができる何度でも呼び出されるようにします。そしてexeが完了したら、その仕事。 CPUを他の新しいジョブに解放する必要があります。ですから、私は複数のプロセス制御機構が必要かもしれないと思います。Pythonマルチプロセッシングで複数の長時間実行されるコンソールEXEを制御できないのですか?

マルチプロセッシングは、python呼び出し可能関数のみを呼び出すことができるためです。コンソールexeを直接呼び出すことはできません。私はpyprocess関数でsubprocess.Popen(cmd)をラップしました。しかし、私がそうした後、私はマルチプロセッシングの前にそれが見つかりました.Process.start()が使用されます。 exeは既に起動しています。そして、問題はそれが何をしているのか(長い時間が必要です)、それは私にコントロールを返しません。プログラムは凍結されています。それは私が望むものではありません。

私は以下のようにコードを掲示しています:

import sys 

import os 

import multiprocessing 

import subprocess 

def subprocessExe(cmd): 

     return subprocess.call(cmd, shell=False, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE,creationflags=0x08000000) 

if __name__ == '__main__': 

     p = multiprocessing.Process(target=self.subprocessExe(exeFileName)) 

     p.start() 

     print p, p.is_alive() 

はお時間をいただき、ありがとうございます!

答えて

2

multiprocessing.Processオブジェクトの作成時にsubprocessExecを呼び出しています。代わりに、これを行う必要があります:

p = multiprocessing.Process(target=subprocessExec, args=(exeFileName,)) 

それが動作するはずです。

+0

は、私はこれを試してみました。それは動作しません。 Python独自のforking.pyモジュールでエラーが発生しました。 – Mua

+0

私が使ったのはあなたがそこに書いたものです。しかし、私のファイル名にはスペースがあります。それには引数が付いているからです。私の "cmd"は "* .exe xyz"のようなものです。サブプロセスに問題はありません。しかし、マルチプロセッシングの処理の引数に "cmd"という文字列全体を置くと、それは "picklingerror"のエラーを報告します – Mua

+0

cmd文字列にスペースを入れずに再試行しました。 exeファイルのみ。それでもエラーが報告されます。私はPython 2.6を使用しています。 – Mua

1

テストケースにはいくつかの問題があります。私にとっては、次の作業:

import multiprocessing, subprocess 

def subprocessExe(cmd): 
    subprocess.call([cmd], shell=False) 

p = multiprocessing.Process(target=subprocessExe, args=('/full/path/to/script.sh',)) 
p.start() 

OR

subprocess.call([cmd], shell=True) 
p = multiprocessing.Process(target=subprocessExe, args=('script.sh',)) 

OR

subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, \ 
           stderr=subprocess.PIPE) 
+0

p.start()の前に 'p.daemon = True'を追加することもできます。 –

関連する問題