【问题标题】:Is it possible for a running python program to overwrite itself?正在运行的 python 程序是否有可能覆盖自己?
【发布时间】:2008-11-14 21:11:57
【问题描述】:

python脚本是否可以打开自己的源文件并覆盖它?

这个想法是为 python 脚本提供一种非常简单且非常肮脏的方式来下载自身的更新,以便下次运行时它会是一个更新的版本。

【问题讨论】:

    标签: python


    【解决方案1】:

    这当然是可能的。加载/导入脚本后,Python 解释器将不再访问它,除非在异常堆栈跟踪中打印源代码行。由于源文件比 pyc 更新,因此下次将重新生成任何 pyc 文件。

    【讨论】:

    • 酷...我认为这不是因为我遇到了一个错误,但我现在发现这是我犯的一个愚蠢的错误。
    • 值得注意的是:如果您删除 .py 文件,但保留 .pyc 文件,该文件仍可能会被导入。每月至少咬我一次。
    【解决方案2】:

    如果您将大部分代码放入一个模块中,您可以让主文件(即运行的那个)检查更新位置,并在导入模块之前自动下载最新版本并安装它.

    这样您就不必重新启动应用程序来运行最新版本,只需重新导入模块即可。

    # Check version of module
    import module
    
    # Check update address
    if update_version > module.version:
        download(update_module)
        import module
        reload(module)
    
    module.main()
    

    您可以使用 reload() 函数来强制模块重新加载它的数据。请注意,对此有一些警告:使用此模块中的类创建的对象不会神奇地更新到新版本,并且重新导入之前的“从模块导入东西”可能会导致“东西”引用旧对象“module.stuff” ”。

    [显然,我没有足够清楚地阅读上一篇文章 - 它完全按照我的建议进行!]

    【讨论】:

    • 是的,但是您的回答要全面得多,因此值得一票:)
    • 我喜欢这个想法,但它不适用于无法安装模块的系统。
    • 您可以随时修改 PYTHONPATH 以包含一个目录:那里的任何文件/文件夹都是 python 模块。
    【解决方案3】:

    实际上,您的应用程序最好从一个很少更改(如果有的话)的虚拟检查下载器开始;在运行之前,它应该检查是否有可用的更新;如果是,那么它将下载它们(通常应用程序的其余部分将是模块),然后导入它们并启动应用程序。

    这样,一旦有可用更新,您就可以启动应用程序并运行最新版本;否则,需要重新启动应用程序。

    【讨论】:

      【解决方案4】:

      您可能还想查看此模块(也包含在 2.5 和 3 中)

      http://www.python.org/doc/2.1.3/lib/os-process.html

      特别是 execv 方法将使用您从此方法调用的任何内容覆盖当前进程。我已经进行了一些人员测试,它工作得非常可靠。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多