运行的python程序是否可以覆盖自身?

时间:2008-11-14 21:11:57

标签: python

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

这个想法是让python脚本有一个非常简单和非常脏的方式来下载自己的更新,以便下次运行时它将是一个更新版本。

4 个答案:

答案 0 :(得分:22)

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

答案 1 :(得分:12)

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

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

# Check version of module
import module

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

module.main()

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

[显然,我没有清楚地阅读上一篇文章 - 它完全符合我的建议!]

答案 2 :(得分:8)

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

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

答案 3 :(得分:1)

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

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

具体来说,execv方法将使用此方法调用的任何内容覆盖当前进程。我做了一些人员测试,它的工作非常可靠。