Python 动态导入模块中的多处理
我有两个班Python 动态导入模块中的多处理,python,python-3.x,multiprocessing,python-import,pickle,Python,Python 3.x,Multiprocessing,Python Import,Pickle,我有两个班A和B。 A应该动态导入B(这样我可以在运行时更改B)。 我还想在B中进行一些多处理 这是我的目录结构: src\ __init__.py a\ __init__.py a.py b\ __init__.py b.py 这是a.py: 导入操作系统,importlib.util 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 模块路径='src\\b\\b.py' 模块名称='b' 类别名称='B'
A
和B
。
A
应该动态导入B
(这样我可以在运行时更改B
)。
我还想在B
中进行一些多处理
这是我的目录结构:
src\
__init__.py
a\
__init__.py
a.py
b\
__init__.py
b.py
这是a.py:
导入操作系统,importlib.util
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
模块路径='src\\b\\b.py'
模块名称='b'
类别名称='B'
#动态导入模块
spec=importlib.util.spec\u from\u file\u位置(模块名称、模块路径)
module=importlib.util.module\u from_spec(spec)
规格加载器执行模块(模块)
#动态实例化类
b_class=getattr(模块,类名称)
b=b_类()
#启动多处理
b、 运行()
这是b.py:
将多处理导入为mp
B类():
def f(自我):
打印(‘成功’)
def运行(自):
打印('运行')
p=mp.Process(目标=self.f)
p、 开始()
p、 加入
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
b=b()
b、 运行()
运行b.py工作正常:
> python src\b\b.py
run
success
运行a.py会引发异常:
> python src\a\a.py
run
Traceback (most recent call last):
File "src\a\a.py", line 18, in <module>
b.run()
File "src\b\b.py", line 10, in run
p.start()
File "C:\Program Files\Python38\lib\multiprocessing\process.py", line 121, in start
self._popen = self._Popen(self)
File "C:\Program Files\Python38\lib\multiprocessing\context.py", line 224, in _Popen
return _default_context.get_context().Process._Popen(process_obj)
File "C:\Program Files\Python38\lib\multiprocessing\context.py", line 327, in _Popen
return Popen(process_obj)
File "C:\Program Files\Python38\lib\multiprocessing\popen_spawn_win32.py", line 93, in __init__
reduction.dump(process_obj, to_child)
File "C:\Program Files\Python38\lib\multiprocessing\reduction.py", line 60, in dump
ForkingPickler(file, protocol).dump(obj)
_pickle.PicklingError: Can't pickle <class 'b.B'>: import of module 'b' failed
C:\Users\micha\Projects\Python\PickleQuestion>Traceback (most recent call last):
File "<string>", line 1, in <module>
File "C:\Program Files\Python38\lib\multiprocessing\spawn.py", line 102, in spawn_main
source_process = _winapi.OpenProcess(
OSError: [WinError 87] Falscher Parameter
python src\a\a.py
跑
回溯(最近一次呼叫最后一次):
文件“src\a\a.py”,第18行,在
b、 运行()
文件“src\b\b.py”,第10行,正在运行
p、 开始()
文件“C:\Program Files\Python38\lib\multiprocessing\process.py”,第121行,在开始处
self.\u popen=self.\u popen(self)
文件“C:\Program Files\Python38\lib\multiprocessing\context.py”,第224行,在\u Popen中
返回_default_context.get_context().Process._Popen(Process_obj)
文件“C:\Program Files\Python38\lib\multiprocessing\context.py”,第327行,在\u Popen中
返回Popen(过程对象)
文件“C:\Program Files\Python38\lib\multiprocessing\popen\u spawn\u win32.py”,第93行,在\uuu init中__
减少.转储(进程对象,到子进程)
文件“C:\Program Files\Python38\lib\multiprocessing\reduce.py”,第60行,转储文件
ForkingPickler(文件、协议).dump(obj)
_pickle.PicklingError:无法pickle:模块“b”的导入失败
C:\Users\micha\Projects\Python\PickleQuestion>Traceback(最后一次调用):
文件“”,第1行,在
文件“C:\Program Files\Python38\lib\multiprocessing\spawn.py”,第102行,在spawn\u main中
source\u process=\u winapi.OpenProcess(
OSError:[WinError 87]Falscher参数
为什么?是否有其他方法可以导入B,同时保持不硬编码的灵活性(来自B import B
)?我希望B.py位于任何包中,甚至在src之外
Python版本:3.8.6对于大多数人来说,答案可能是:
来自pydoc导入locate
b_class=locate('b.b'))
对于我来说,我决定重构我的应用程序,这样我一开始就不需要动态导入。我现在在b.py
中启动应用程序,并将b
作为参数传递给a.py
。