Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 动态导入模块中的多处理_Python_Python 3.x_Multiprocessing_Python Import_Pickle - Fatal编程技术网

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