【问题标题】:Python object persistence over re-execsPython 对象持久性超过 re-execs
【发布时间】:2011-05-17 00:02:43
【问题描述】:

在哪里可以通过重新执行正在运行的脚本来持久化对象?如果我想要一个正在运行的脚本重新执行自身以获取任何代码更改,(os.exec *)有没有办法在重新执行后保留对象以供访问?我可以使用腌制的 ascii 数据设置环境变量,或者将该数据写入管道并在重新执行后重新读取它,但这似乎不优雅或像 hack。即使这样做,也不是所有的东西都腌制得很好。

【问题讨论】:

  • “重新执行”是什么意思?您的脚本在同一个会话中被用户终止并再次运行?或者你的脚本使用 os.exec() 调用自己?
  • @boaz 脚本使用 os.exec 调用自身
  • 那么这对我来说似乎是个坏主意,除非你想并行运行多个进程(但你不想要持久性)。 Python 有很多用于运行 Python 代码的工具,因此您不需要将 os.exec() 用于 Python 脚本。你看过 Greg 的解决方案吗?
  • Gregs 解决方案是我现在计划实施的方式。该进程将是嵌入式 linux 系统上的 init 进程,因此重新读取 init 代码的唯一其他选择是重新启动。这不是不可接受的,因为代码更改不应在开发后随 init 更改。我只是想模仿 sysvinit

标签: python process exec


【解决方案1】:

如果你把你的代码放在一个模块中,你可以使用reload()标准函数来加载新版本的代码。您的主模块可能如下所示:

import mymodule

while mymodule.go():
    reload(mymodule)

当你想重新加载你的模块代码时,从go()返回True。当你想退出时,返回False

【讨论】:

    【解决方案2】:

    查看shelve

    import shelve
    
    db = shelve.open("database", "c")
    db["one"] = 1
    db["two"] = 2
    db["three"] = 3
    db.close()
    

    【讨论】:

    • 如果我能侥幸逃脱,我不想担心我试图保存哪些对象以及它们是否会按预期腌制。
    猜你喜欢
    • 2021-04-05
    • 2011-12-25
    • 2011-01-23
    • 1970-01-01
    • 2011-05-25
    • 2013-06-04
    • 2010-12-26
    • 2011-05-30
    相关资源
    最近更新 更多