F. *_*tin 10 python multiprocessing
我正在使用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
Run Code Online (Sandbox Code Playgroud)
sys.executable 返回应用程序的路径.
我试过这个:
multiprocessing.forking.set_executable('C:\Python31\python.exe')
multiprocessing.set_executable('C:\Python31\python.exe')
Run Code Online (Sandbox Code Playgroud)
没有成功.
有可能的解决方法吗?我不太可能有能力让应用程序的开发人员在他们的代码中改变一些东西.
谢谢
编辑
我通过添加以下内容来实现它:
sys.argv = ['c:/pathToScript/scipt.py']
我也需要这一行:
multiprocessing.set_executable('C:/Python31/python.exe')
否则,应用程序的其他实例将打开而不是运行代码.
我唯一的问题是我不能使用控制应用程序本身的方法(如:create_project(),add_report(),..).我的主要目标是能够调用多个方法而无需等待第一个方法完成.但我认为这是不可能的.
Jan*_*ila 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)