我正在使用Python 3.1.4作为脚本环境嵌入到应用程序(x64)中。 到目前为止,我遇到了嵌入式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(),..)。我的主要目标是能够调用多个方法而无需等待第一个方法完成。但我认为这是不可能的。
答案 0 :(得分:10)
默认情况下,sys.argv
在嵌入式代码中不可用:
Embedding Python
基本初始化函数是Py_Initialize()。这初始化 加载模块表,并创建基本模块 builtins,__ main__和sys。它还初始化模块搜索 path(sys.path)。
Py_Initialize()不设置“脚本参数列表”(sys.argv)。如果 稍后将执行的Python代码需要此变量 必须通过调用PySys_SetArgvEx(argc,argv,显式设置) update_)调用Py_Initialize()
之后
在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)