10

アプリケーション(x64)にスクリプト環境として組み込まれているPython3.1.4を使用しています。これまでのところ、埋め込まれた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アプリケーションへのパスを返します。

私はこれをウェルとして試しました:

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

成功せずに。

可能な回避策はありますか?アプリケーションの開発者にコード内の何かを変更させるためのレバレッジを持っている可能性はほとんどありません。

ありがとう

編集

以下を追加することで動作させました。

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

私もこの行が必要でした:

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

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

私が残した唯一の問題は、アプリケーション自体を制御するメソッド(create_project()、add_report()、..など)を使用できないことです。私の主な目標は、最初のメソッドが完了するのを待たずに、複数のメソッドを呼び出せるようにすることでした。しかし、これは不可能だと思います。

4

1 に答える 1

11

デフォルトでsys.argvは、埋め込みコードでは使用できません。

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']あなたが発見したように、サブプロセスを作成する前に割り当てることは、良い回避策のように思われます。

2番目の関連ドキュメントは次のmultiprocessing.set_executable()とおりです。

子プロセスを開始するときに使用するPythonインタープリターのパスを設定します。(デフォルト sys.executableで使用されます)。埋め込み者はおそらく次のようなことをする必要があります

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
子プロセスを作成する前に。(Windowsのみ)

于 2013-03-26T12:06:20.267 に答える