问题是,您正在函数内部创建一个函数。
功能
Fn_deleteFiles(inp)
,在的内部定义
deleteFiles(loc)
.
这意味着
删除文件(inp)
只有在
删除文件(loc)
正在运行。
问题是,在内部,
multiprocessing.pool.Pool()
调用
pickle
库将函数对象从这个python进程传输到正在生成的一个新的python函数。
然而,
泡菜
将无法
架线
一个函数,如果它不能定位函数的原点。
下面是演示类似错误的演示。
import pickle
def foo():
def bar():
return "Hello"
return bar
bar = foo()
if __name__ == '__main__':
s = pickle.dumps(bar)
将导致相同的错误:
Traceback (most recent call last):
File ".../stacktest.py", line 10, in
s = pickle.dumps(bar)
AttributeError: Can't pickle local object 'foo..bar'
因此要修复此错误,您可以使用
multiprocessing.pool.ThreadPool
相反,因为它不会泡菜。
import os
from multiprocessing.pool import ThreadPool as Pool
def deleteFiles(loc):
def Fn_deleteFiles(inp):
[fn, loc] = [inp['fn'], inp['loc']]
os.remove(os.path.join(loc, fn))
p = Pool(5)
for path, subdirs, files in os.walk(loc):
if len(files) > 0:
inpData = [{'fn':x, 'loc':loc} for x in files]
p.map(Fn_deleteFiles, inpData)
p.close()
if __name__ == '__main__':
loc = 'DriveWithFilesToDelete'
deleteFiles(loc)
或者,您可以定义
删除文件(inp)
外部
删除文件(loc)
解决这个问题。
警告
由于我不理解的原因,这个答案将挂在空闲的解释器内部。
import os
from multiprocessing import Pool
def Fn_deleteFiles(inp):
print("Delete", inp)
[fn, loc] = [inp['fn'], inp['loc']]
os.remove(os.path.join(loc, fn))
def deleteFiles(loc):
p = Pool(5)
for path, subdirs, files in os.walk(loc):
if len(files) > 0:
inpData = [{'fn':x, 'loc':loc} for x in files]
p.map(Fn_deleteFiles, inpData)
p.close()
if __name__ == '__main__':
loc = 'DriveWithFilesToDelete'
deleteFiles(loc)