使用PyInstaller但保持.py文件可升级

9 投票
4 回答
2193 浏览
提问于 2025-04-16 14:03

我已经成功把我的PyQt4应用打包成一个“独立”的应用程序,在Windows上可以正常运行。

不过,这个应用可以自我升级,也就是说它会把我写的代码文件(.py文件)替换成新的版本,这些新版本是通过互联网下载的。

我该怎么告诉PyInstaller,让它完成打包的工作(比如把DLL文件放在一起,生成带有漂亮图标的启动器等等),但是又不去动那些.py文件呢?

我需要这些文件直接保留在磁盘上,这样自动更新才能正常工作。

4 个回答

0

我觉得可执行文件里的嵌入式解释器还是会在同一个文件夹里或者PYTHONPATH中查找.py文件。py2exe会使用一个压缩文件来存放原生的Python组件,记得没错的话,pyinstaller则是把所有这些组件都嵌入到可执行文件里。也许有个选项可以像py2exe那样保留一个压缩文件(或者在spec文件中不添加它们),然后可以尝试在没有这些文件的情况下运行应用程序,并用procmon监控文件的访问情况。

1

其实是这样的:

a = Analysis(['main.py'])
excluded = ['pathto\\myfile0.py', 'pathto\\myfile1.py', 'pathto\\myfile2.py']
a.scripts = [script from script in a.scripts if script[1] not in excluded]
pyz = PYZ(a.pure)
excluded_files_collect = [(f.split('\\')[-1],f,'DATA') for f in excluded]
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1)
dist = COLLECT(exe, a.binaries, excluded_files_collect , name="dist")

这个脚本实际上是一个元组,格式是:

('myfile0.py', 'pathto\\myfile0.py', 'PYSOURCE')

你可能还需要阻止某些文件被包含在PYZ里,可以查看pyz的目录表,看看它们是否被包含。我是通过在Analysis()中使用excludes=[myfile0]来排除它们的。

5

你可以修改规格文件,特别指定不包含某些文件(在生成列表时),然后确保这些文件被包含在内——我需要确认一下是否有选项可以包含但不编译。


我自己没有尝试过这个(我在工作中使用pyInstaller,但在家里的电脑上没有设置),不过我觉得这种做法应该没问题:

a = Analysis(['main.py'])
excluded = ['myfile0.py', 'myfile1.py', 'myfile2.py']
a.scripts = [script from script in a.scripts if script not in excluded]
pyz = PYZ(a.pure)
exe = EXE(a.scripts, pyz, name="main.exe", exclude_binaries=1)
dist = COLLECT(exe, a.binaries, excluded, name="dist")

撰写回答