Python 从另一个模块调用时,找不到模块多处理错误
我开始在我的代码中包含多处理,因为我试图自动化的任务从计算角度来说是相当昂贵的。根据我收集的stackoverflow信息,代码中的模块结构如下所示。我正在Win10中开发Python3.7 main:除了加载输入等,还调用多处理函数的地方Python 从另一个模块调用时,找不到模块多处理错误,python,python-3.x,multiprocessing,python-multiprocessing,Python,Python 3.x,Multiprocessing,Python Multiprocessing,我开始在我的代码中包含多处理,因为我试图自动化的任务从计算角度来说是相当昂贵的。根据我收集的stackoverflow信息,代码中的模块结构如下所示。我正在Win10中开发Python3.7 main:除了加载输入等,还调用多处理函数的地方 import pandas as pd import run def do(): df=pd.DataFrame({'Identifier': ['id_1', 'id_1', 'id_1', 'id_1', 'id_1', 'id_2', 'id
import pandas as pd
import run
def do():
df=pd.DataFrame({'Identifier': ['id_1', 'id_1', 'id_1', 'id_1', 'id_1', 'id_2', 'id_2', 'id_2', 'id_2', 'id_2', 'id_3', 'id_3', 'id_3', 'id_3', 'id_3'],
'float_id': [1, 2, 3, 4, 5, 10, 25, 33, 45, 50, .1, .2, .3, .4, .5],
'a': np.random.rand(15),
'b': np.random.rand(15),
'c': np.random.rand(15)})
v_column=['a', 'b', 'c']
df_out=run.function_multiprocessing(df, v_column)
return df_out
if __name__=='__main__':
df_out=do()
- 运行:多处理功能所在的位置
- defs:函数到“多进程”(函数到应用)的位置
Process SpawnPoolWorker-1:
Traceback (most recent call last):
File "C:\Users\xxxx\AppData\Local\Continuum\anaconda3\lib\multiprocessing\process.py", line 297, in _bootstrap
self.run()
File "C:\Users\xxxx\AppData\Local\Continuum\anaconda3\lib\multiprocessing\process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\xxxx\AppData\Local\Continuum\anaconda3\lib\multiprocessing\pool.py", line 110, in worker
task = get()
File "C:\Users\xxxx\AppData\Local\Continuum\anaconda3\lib\multiprocessing\queues.py", line 354, in get
return _ForkingPickler.loads(res)
ModuleNotFoundError: No module named 'defs'
我尝试在导入多处理模块后包含行multiprocessing.set\u start\u method(“fork”)
,这引发了一个错误。“spawn”
也一样。我还尝试将模块“defs”作为参数包含在function\u multiprocessing
方法中,并从main
调用它,但没有成功。当提供“function_to_apply”作为参数时,也会发生相同的错误
我做错了什么?我怎样才能让它工作
事先非常感谢
更新:导入函数\u多处理
方法中的defs.py
模块时
def function_multiprocessing(data, v_column):
import defs
list_df=[]
...
它不会引起任何错误。但是,当将模块作为变量提供时,它不起作用。File
defs.py
则需要与“main”程序位于同一目录中。如果main.py
、run.py
和defs.py
都在同一个文件夹中,那么我不明白您是如何得到这个错误的,因为“main”程序所在的目录,即在这种情况下具有main.py
的目录,会自动前置到sys.path
@boobooboo,所有文件都位于同一目录中。当使用ThreadPool
类而不是Pool
类时,错误不再出现,尽管计算时间似乎与线性执行代码时没有变化。我刚刚看到了您的更新。通过将导入移动到内部函数\u multiprocessing
,子进程将不会执行导入。我不认为这实际上是一个“模块未找到错误”,而是在全局范围内的defs
中正在执行的生成错误的代码。@Booboo,非常感谢您的快速回答!您认为有没有一种方法可以不在函数内部导入模块,而是能够执行它?我相信这个解决方案不会是最佳实践方面的首选方案。好吧,我只是在猜测这个问题。您是否查看了defs
以了解实际上是否有可执行代码在被子进程重新执行时可能引发异常?文件小到可以发布吗?如果它确实有这样的代码,不容易修改,我真的不认为你的解决方案有什么问题。
def function_multiprocessing(data, v_column):
import defs
list_df=[]
...