PyInstaller但保持.py文件可升级

9
我已经成功将我的 PyQt4 应用程序打包成了 Windows "独立"应用程序,它可以使用。但是该应用程序可以自我升级,通过下载通过互联网下载的新版本(.py 文件)来替换我编写的实际代码。如何告诉 PyInstaller 完成其工作(组合 DLL、生成带有闪亮图标的启动器等),但让 .py 文件不受影响?我需要直接在磁盘上保存这些文件,以使自动更新功能正常工作。
4个回答

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")

@Flavius 我在我的答案中提供了一个示例,不过考虑一下你可能想要使用py[co]文件,这取决于你部署给谁,是否真的希望他们看到你的源代码以及性能有多重要。 - theheadofabroom

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]将它们排除了。

0

我认为可执行文件中的嵌入式解释器仍会在同一目录和/或PYTHONPATH中搜索.py文件,py2exe使用zip文件作为本地Python组件,如果我没记错,pyinstaller将所有组件都嵌入到可执行文件中,也许有一个选项可以像py2exe一样保留zip文件(或者不将它们添加到规范中),然后尝试在没有这些文件的情况下运行应用程序,并使用procmon监视文件访问。


0

pyinstaller提供了--exclude选项,适用于您的用例,并且还可以使用.spec文件中Analysis()excludes参数设置要忽略的模块或包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接