10

我正在使用作为脚本环境嵌入到应用程序(x64)中的 Python 3.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()。这会初始化加载模块的表,并创建基本模块 builtins、__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()

设置启动子进程时要使用的 Python 解释器的路径。(默认 sys.executable使用)。嵌入者可能需要做一些事情,比如

set_executable(os.path.join(sys.exec_prefix, 'pythonw.exe'))
在他们可以创建子进程之前。(仅限 Windows)

于 2013-03-26T12:06:20.267 回答