我目前正在研究一种远程修补/更新软件的方法,而无需在我发布新版本时要求用户重新安装
(也就是说,我不需要重新打包
executable
,用户也不需要重新安装executable
)
目前我使用虚拟脚本(使用 pyinstaller 编译为二进制文件)来导入实际脚本(编译为 .pyd),并在启动时检查更新。 (详细说明见此回复)
但是,这仅解决了修补/更新的前端静态和后端逻辑部分,因为我必须在使用 pyinstaller 构建
executable
时包含所有必要的模块,这限制了我在将来的更新中能够使用的模块,无论何时我需要一个新的模块,我仍然需要重新编译来打包它,并要求用户重新安装。
所以我想到了另一个想法,那就是,将所需的模块列表(
requirements.txt
)与其他静态文件一起保留在服务器上,在启动时检查更新的同时,还检查所有模块是否已安装在服务器上内容目录。
为了实现此目的,我需要访问已编译的二进制文件中的
pip
以及 --target
参数,以将目标目录定位到 contents_directory(请参阅 this)。
我发现了 this,使用
subprocess
来调用 python -m pip install
,但是 subprocess
通过运行 python
命令来实现这一点,用户可能没有安装或设置 python PATH
。
在Python代码中还有另一种直接导入
pip
的方法(代码示例请参见this),但官方似乎不推荐这种方法,因为pip
的主程序大部分都在中pip._internal
。
使用 pyinstaller 将 python 模块(包括安装和卸载模块)打包成二进制可执行文件并发送给最有可能没有安装
python
的用户后,管理 python 模块(包括安装和卸载模块)的正确方法是什么。
executable
使用 pyinstaller 和 --onedir
进行打包。requests
模块,从我的服务器获取版本(.version
)和本地文件结构(.xml
)pip install -r req.txt
的方法,我在想是否可以将requirements.txt
也保存在服务器上,然后获取它,运行它。我认为您不需要访问
pip
。
如果用户同意升级。您可以直接下载包含所有必需模块的 zip 文件,然后将其解压缩到 exe 安装路径。您还可以从服务器获取数据,告诉您要删除的模块。
最后,显示一个消息框并告诉用户重新启动软件。
这就是我目前所做的。希望有帮助。