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,这似乎不是,并用您所在的平台标记您的问题运行,例如 windowslinux 每当您用 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