【发布时间】:2008-11-14 21:11:57
【问题描述】:
python脚本是否可以打开自己的源文件并覆盖它?
这个想法是为 python 脚本提供一种非常简单且非常肮脏的方式来下载自身的更新,以便下次运行时它会是一个更新的版本。
【问题讨论】:
标签: python
python脚本是否可以打开自己的源文件并覆盖它?
这个想法是为 python 脚本提供一种非常简单且非常肮脏的方式来下载自身的更新,以便下次运行时它会是一个更新的版本。
【问题讨论】:
标签: python
这当然是可能的。加载/导入脚本后,Python 解释器将不再访问它,除非在异常堆栈跟踪中打印源代码行。由于源文件比 pyc 更新,因此下次将重新生成任何 pyc 文件。
【讨论】:
如果您将大部分代码放入一个模块中,您可以让主文件(即运行的那个)检查更新位置,并在导入模块之前自动下载最新版本并安装它.
这样您就不必重新启动应用程序来运行最新版本,只需重新导入模块即可。
# 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” ”。
[显然,我没有足够清楚地阅读上一篇文章 - 它完全按照我的建议进行!]
【讨论】:
实际上,您的应用程序最好从一个很少更改(如果有的话)的虚拟检查下载器开始;在运行之前,它应该检查是否有可用的更新;如果是,那么它将下载它们(通常应用程序的其余部分将是模块),然后导入它们并启动应用程序。
这样,一旦有可用更新,您就可以启动应用程序并运行最新版本;否则,需要重新启动应用程序。
【讨论】:
您可能还想查看此模块(也包含在 2.5 和 3 中)
http://www.python.org/doc/2.1.3/lib/os-process.html
特别是 execv 方法将使用您从此方法调用的任何内容覆盖当前进程。我已经进行了一些人员测试,它工作得非常可靠。
【讨论】: