我有一个my_module
模块,其中包含my_func()
个功能。当我在父进程中使用此函数时,一切都运行良好(我从此函数得到正确的结果)。但是当我从子进程调用此函数时,我收到此错误:
AttributeError: module 'my_module' has no attribute 'my_func'
有人知道我做错了什么吗?这是我的模板代码:
import pandas as pd, gc, sys, multiprocessing as mp, traceback as tb
sys.path.append('c:/my_libs/')
import my_module
def mp_func(df, i):
df['res'] = df.apply(lambda x: my_module.my_func(x, i))
return df
def other_function(df):
# do something
my_list = [1,2,3] # it can change dynamically based on previous code
df_res = pd.DataFrame()
mp_pool = mp.Pool(processes=min(len(my_list), mp.cpu_count()))
try:
for i_df in [y.get() for y in [mp_pool.apply_async(mp_func\
, [df[['my_attr']], i]) for i in my_list]]:
df_res = df_res.append(i_df)
except Exception as e:
print('Something went wrong during multiprocessing:\n', e)
print('\nFull traceback:\n', tb.format_exc())
finally:
mp_pool.close()
gc.collect()
df_res.to_csv(<...>)
if __name__ == '__main__':
df = pd.read_csv(<...>)
other_function(df)
my_module
模块看起来像这样:
def my_func(x, i):
return x * i
同样,如果我运行相同代码的NOT多处理版本,那么一切都运行良好。 (我使用python 3)
谢谢!
答案 0 :(得分:0)
最后我发现了问题。我使用Spyder,并在其中将默认工作目录设置为另一个文件夹,其中我有一个以前版本的模块。这个topic帮助我在子进程中打印出导入模块的路径。