2013-03-26 12 views
7

私は、アプリケーション(x64)でスクリプト環境として組み込まれているPython 3.1.4を使用しています。 これまでのところ、私は組み込みのpythonに多くの制限がありました。私はそれが正常であるのか、アプリケーションのプログラマーがいくつかの機能をブロックしているのかどうかはわかりません。組み込みPython:マルチプロセッシングが動作しない

たとえば次のコードは動作していない。

from multiprocessing import Process 
def f(name): 
    print('hello', name) 

if __name__ == '__main__': 
    p = Process(target=f, args=('bob',)) 
    p.start() 
    p.join() 

# --> error in forking.py: 'module' object has no attribute 'argv' 
# print(sys.argv) gives the same error 

sys.executableリターンアプリケーションへのパス。

私はWELとしてこれを試してみた:

multiprocessing.forking.set_executable('C:\Python31\python.exe') 
multiprocessing.set_executable('C:\Python31\python.exe') 

成功せず。

回避策はありますか?アプリケーションの開発者がコード内で何かを変えるようにするために、私が利用することはほとんどありません。

EDIT

おかげで私はそれが次のように追加することで動作するようになった:

sys.argv = ['c:/pathToScript/scipt.py']

私もこの行を必要:

multiprocessing.set_executable('C:/Python31/python.exe')

それ以外の場合は、コードを実行する代わりに、アプリケーションの他のインスタンスが開きます。

私が残した唯一の問題は、アプリケーション自体を制御するメソッド(create_project()、add_report()など)を使用できないことです。私の主な目標は、最初のものが完了するのを待つ必要なく、複数のメソッドを呼び出すことでした。しかし、私はこれはちょうど不可能だと思う。デフォルトで

+0

マルチプロセッシングの代わりにスレッドを使用するのではないですか? –

+0

どちらのOSですか...... – NPE

+0

@ Ionut Hulub:私は糸通しにも問題があります。だから私はマルチプロセッシングで試したのです @ NPE:Windows 7、64bit –

答えて

7

は、sys.argvは、埋め込まれたコードでは使用できません:

Embedding Python

基本的な初期化関数は、()Py_Initializeあります。 ロードされたモジュールのテーブルを初期化し、基本モジュール 組み込み関数、__main__、およびsysを作成します。また、モジュール検索 パス(sys.path)を初期化します。

Py_Initialize()は、「スクリプト引数リスト」(sys.argv)を設定しません。この変数は、後に実行されるPythonコードで必要とされる 場合、それ は、Py_Initialize(への呼び出し後にPySys_SetArgvExへの呼び出し(のargc、argvの、 updatepath))は、Windows上で

で明示的に設定する必要がありますmultiprocessingは、最初から新しいプロセスを生成する必要があります。子プロセスを区別するためにコマンドラインスイッチ--multiprocessing-forkを使用し、親から子に元のargvも送信します。

サブプロセスを作成する前にsys.argv = ['c:/pathToScript/scipt.py']を割り当てると、発見したように、 が適切な回避策のようです。

は子プロセスを開始するときに使用するパイソン インタプリタのパスを設定:

ドキュメントの第二の関連する部分は、multiprocessing.set_executable()のことです。 (デフォルトでは sys.executableが使用されます)。エンベッダは、おそらく彼らは子プロセスを作成することができます 前

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
のようないくつかのこと を行う必要があります。 (Windowsのみ)