python运行results = pool.map(face_recognize, numbers)报错_pickle.PicklingError: Can't pickle <function face_recognize at 0x7f8f0ca950>: attribute lookup face_recognize on __main__ failed
时间: 2024-03-28 20:38:50 浏览: 66
这个错误通常是由于Python的多进程模块(如multiprocessing)无法序列化函数导致的。解决方法是将该函数定义在可导入的模块中,而不是在主程序中。您可以将`face_recognize`函数定义在一个单独的.py文件中,并使用`import`语句将其导入到主程序中。这样就可以避免`Can't pickle`错误了。
相关问题
运行results = pool.map(face_recognize, numbers)报错AttributeError: Can't pickle local object 'RockxFaceRecognition.run.<locals>.face_recognize'
这个错误通常是由于 multiprocessing 库无法序列化某些对象引起的。在您的情况下,似乎是由于 `face_recognize` 函数中的某些本地对象无法序列化。
为了解决这个问题,您可以尝试将 `face_recognize` 函数定义为一个独立的函数,而不是在 `run` 方法内部定义的本地函数。或者,您可以使用 `dill` 库对 `face_recognize` 函数进行序列化和反序列化,以便 multiprocessing 库可以正确地处理它。
具体来说,您可以尝试使用以下代码:
```
import dill
def run(self):
# ...
with multiprocessing.Pool(processes=4) as pool:
results = pool.map(dill.loads(dill.dumps(face_recognize)), numbers)
# ...
```
使用 `dill.loads(dill.dumps(face_recognize))` 将 `face_recognize` 函数序列化并反序列化,从而允许 multiprocessing 库正确地处理它。
改进这段代码def face_recognize(i): # converted_results = [] # for result in results: # face align result = results[i] t0 = time.time() ret, align_img = face_landmark5_handle.rockx_face_align(frame, in_img_w, in_img_h, 使得运行with Pool(processes=4) as pool: results = pool.map(face_recognize, numbers)时不报错_pickle.PicklingError: Can't pickle <function face_recognize at 0x7f8f0ca950>: attribute lookup face_recognize on __main__ failed
这个错误是由于使用 multiprocessing.Pool 时,函数 face_recognize 无法被 pickle 序列化导致的。解决方法有两个:
1. 把 face_recognize 函数定义在 main 函数内部,而不是全局作用域内。
2. 使用 multiprocessing.Pool.imap 或 multiprocessing.Pool.imap_unordered 代替 multiprocessing.Pool.map,因为这两个函数不需要对函数进行序列化。例如:
```
with Pool(processes=4) as pool:
results = pool.imap_unordered(face_recognize, numbers)
```
阅读全文