使用 pyinstaller 打包成二进制可执行文件后管理 python 模块的正确方法

问题描述 投票:0回答:1

我是如何遇到这个问题的

我目前正在研究一种远程修补/更新软件的方法,而无需在我发布新版本时要求用户重新安装

(也就是说,我不需要重新打包

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
    也保存在服务器上,然后获取它,运行它。
  • 我正在使用自己的包LoadingWindow来显示设置(检查更新)过程,所以如果我可以获得模块检查回调,那就太好了。
python-3.x pip pyinstaller executable auto-update
1个回答
0
投票

我认为您不需要访问

pip

如果用户同意升级。您可以直接下载包含所有必需模块的 zip 文件,然后将其解压缩到 exe 安装路径。您还可以从服务器获取数据,告诉您要删除的模块。

最后,显示一个消息框并告诉用户重新启动软件。

这就是我目前所做的。希望有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.