pickle.PicklingError: Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute look
Posted
技术标签:
【中文标题】pickle.PicklingError: Can\'t pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute lookup past_match_sim on __main__ failed【英文标题】:pickle.PicklingError: Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute lookup past_match_sim on __main__ failedpickle.PicklingError: Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute lookup past_match_sim on __main__ failed 【发布时间】:2021-12-30 02:31:39 【问题描述】:我正在尝试使用多处理模块一次运行多个文件.....
import multiprocessing
import schedule
import time
if len(abc)==1:
def live_run1():
def lv1():
exec(open('/path to file/file1.py').read())
def lv_s():
exec(open('/path to file/file2.py').read())
import multiprocessing
if __name__ == '__main__':
p11 = multiprocessing.Process(target=lv1)
p12 = multiprocessing.Process(target=lv_s)
p11.start()
p12.start()
p11.join()
p12.join()
time.sleep(500)
exec(open('/path to file/file3.py').read())
return schedule.CancelJob
schedule.every().day.at("10:30").do(live_run1)
while True:
schedule.run_pending()
time.sleep(1)
我得到的错误:
pickle.PicklingError: Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute lookup past_match_sim on __main__ failed
我无法摆脱这个问题......
感谢任何帮助
【问题讨论】:
将函数lv1
和 'lv_s` 移动到全局范围,即不要将它们嵌套在 live_run1
中。 exec
是什么?这应该是 Python 内置函数还是您的帖子中未声明的其他内容(您应该发布minimal, reproducible example,这似乎不是,并用您所在的平台标记您的问题运行,例如 windows
或 linux
每当您用 multiprocessing
标记问题时?
抱歉缺少信息.....我在 linux 中运行此代码(这是我尝试使用 cronjob 安排的文件)。还有 exec() 是一个运行 python 脚本的函数文件(内置)....我尝试了全局范围内的函数,但仍然出现相同的错误...
内置函数采用 Python 代码的 string 参数,例如 exec('x = 7 + 3')
或使用 @ 创建的 code object 参数987654331@ 功能。你也没有通过。你为什么要使用exec
?为什么函数lv1
的定义不只是open('/path to file/file1.py').read()
?当然,我不知道只是读取文件然后什么都不做结果的目的是什么。但那是另一回事了。
【参考方案1】:
可以对您的代码进行可能的修复。
我修改了代码不使用schedule
模块,因为它在酸洗全局函数时会遇到一些麻烦,因此我决定在没有schedule
的情况下实现相同的功能:
Try it online!
import multiprocessing, time, datetime
def lv1():
exec(open('0603.py').read())
def lv_s():
exec(open('0604.py').read())
def live_run1():
p11 = multiprocessing.Process(target=lv1)
p12 = multiprocessing.Process(target=lv_s)
p11.start()
p12.start()
p11.join()
p12.join()
time.sleep(2)
exec(open('0605.py').read())
def today_at(hour, minute = 0, second = 0):
now = datetime.datetime.now()
return datetime.datetime(
year = now.year, month = now.month,
day = now.day, hour = hour,
minute = minute, second = second)
def now():
return datetime.datetime.now()
def run_at(hour, minute, second = 0, *, done = set()):
at = today_at(hour, minute, second)
if str(at) not in done and now() >= at and (
now() - at <= datetime.timedelta(seconds = 10)
):
print('started running at', now())
live_run1()
print('finished running at', now())
done.add(str(at))
if __name__ == '__main__':
print('now is', now())
while True:
run_at(7, 3, 40)
run_at(10, 40)
time.sleep(1)
输出:
now is 2021-11-22 07:03:32.389326
started running at 2021-11-22 07:03:40.404687
0603
0604
0605
finished running at 2021-11-22 07:03:42.447017
【讨论】:
在执行时仍然出现上述错误..................... @Ashin 刚刚修复了我的代码,请再看一下我的答案。这个酸洗错误是由于schedule
模块而发生的,它不支持multiprocessing
运行,因此我决定在没有schedule
的情况下实现相同的功能。查看我的代码,它完全符合您的要求,但没有schedule
。查看我的代码的最后以了解如何使用我的代码,有run_at(...)
在指定时间运行而不是使用调度。
我尝试了同样的错误.....但我真的很感谢你为解决这个错误付出了这么多努力。干得好@Arty
@Ashin 您是否从我的答案中尝试了我当前的代码?您是否注意到我已经将代码更改为不同的代码?你不可能有完全相同的错误,因为你有schedule
-package 错误,而我根本不再使用schedule
!当您在计算机上运行我的代码(来自我的回答)时,您能否发布您现在得到的确切错误文本,而不对我的代码进行任何修改?点击我的答案中的Try it online!
链接,它在线运行我的代码并且没有显示错误,通过这个链接I get this screen,在右侧的控制台中没有显示错误。
@Arty....对于延迟回复真的很抱歉....我再次尝试了您的代码并返回了我提到的相同错误....bt 您的代码没有错误并且在另一个场景中运行......所以我认为实际问题是另一个不是由于调度模块......还有一件事,file1.py 也在它里面做一些其他的多处理(池)所以我认为错误是因为那个。以上是关于pickle.PicklingError: Can't pickle <function past_match_sim at 0x7fa26e03b7b8>: attribute look的主要内容,如果未能解决你的问题,请参考以下文章
_pickle.PicklingError:无法序列化对象:TypeError:无法腌制_thread.RLock对象
pickle.PicklingError:无法腌制未打开读取的文件
自定义 sklearn 管道变压器给出“pickle.PicklingError”
关于tcp连接对象在多进程中的错误:pickle.PicklingError
带有joblib库的spacy生成_pickle.PicklingError:无法腌制任务以将其发送给工作人员
尝试从 BigQuery 读取表并使用 Airflow 将其保存为数据框时出现 _pickle.PicklingError