使用程序本身更新使用 Pyinstaller 创建的程序依赖项

Updating program's dependencies created with Pyinstaller, with the program itself

我制作了一个依赖于模块 pytube 的 .exe 文件,并想 运行 它在我朋友的电脑上,他们没有 python 安装。但是,pytube 每隔一段时间就会更新一次,我希望我提供给我朋友的 .exe 保持最新状态。

用Pyinstaller输出.exe后,是否可以用创建的.exe更新.exe的依赖关系?

我创建了一个脚本,每次 .exe 为 运行 时,该脚本将从 Github 获取更新的模块文件并将它们保存到给定目录中。我想在 Pyinstaller 创建后使用此脚本更新我的 .exe 的依赖项。

我的第一个想法是我会在 Pyinstaller 的输出中找到依赖项的存储位置,然后让我的程序用新下载的模块文件覆盖它。然而:

A) 我不知道在 Pyinstaller 输出中哪里可以找到这些文件

B) 我希望这些模块相关文件在之后会采用不同的格式 Pyinstaller 已经创建了 .exe 等。比从下载它们时 Github.

有人对如何克服这个问题有任何建议吗?

谢谢。

PyInstaller 创建扩展名为 .exe 的自解压 zip 文件。当你 运行 .exe 然后它创建临时文件夹 _MEI_xxxxxx (其中 xxxxxx 是一个随机数),解压模块和代码并 运行s 它。但是当你关闭程序时,它会删除这个文件夹。因此,最好将模块下载到保存 .exe 文件的文件夹,并在导入前将此文件夹添加到 sys.path

您可以在 How the One-File Program Works

中阅读更多内容

可能您可以获得.exe 使用的文件夹。在主脚本中使用类似这样的东西:

HOME = os.path.abspath(os.path.dirname(sys.argv[0]))

或使用__file__

HOME = os.path.abspath(os.path.dirname(__file__))

PyInstaller 将原始模块保存在 .zip 中——它们没有不同的格式。脚本仍然可以使用以后添加的模块——它们不必重新格式化。它们必须位于 sys.path 中的文件夹中,或者您必须在导入前将此文件夹 append()sys.path


编辑: Whosebug 上有一个问题 Determining application path in a Python EXE generated by pyInstaller,它解释了如何查找脚本使用的文件夹。