Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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 Multiprocessing - Fatal编程技术网

Python 从另一个模块调用时,找不到模块多处理错误

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

我开始在我的代码中包含多处理,因为我试图自动化的任务从计算角度来说是相当昂贵的。根据我收集的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_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:函数到“多进程”(函数到应用)的位置
这些模块都不属于my PytonPath,并且位于同一文件夹中。我要做的是在每个“标识符”上应用一个函数,分别基于“float_id”中的值和“a”、“b”和“c”列的值。为了简单起见,我们可以考虑基于“float_id”值的列值的加权平均值

当我执行代码时,无论我尝试了什么,我都会为每个工作人员一次又一次地得到以下错误

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=[]
    ...