2011-03-20 56 views
7

我已经成功地包装我PyQt4的应用程序作为Windows上的“独立”的应用程序,它的工作原理。PyInstaller但保持.py文件升级

但是这个应用程序可以升级本身,这是通过更换新的版本,通过互联网下载我写的实际代码(.py文件)来完成。

我怎么能告诉PyInstaller完成自己的工作(放在一起的DLL文件,与闪亮的图标生成发射器,等等),但让.py文件不变?

我需要这些文件直接在磁盘上,为了使自动更新工作。

回答

4

可以更改规范文件明确不包括由名文件(建筑列表时),然后确保这些文件包括 - 我必须检查是否有包括但不编译选项。


我还没有尝试过这个自己(我用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") 
+0

如果您可以提供样本.spec,我可以接受。 – Flavius 2011-03-20 09:34:21

+0

@Flavius我提供了一个编辑示例给我的anser,虽然考虑一下,您可能想使用py [co]文件,具体取决于您部署的人员,是否真的希望他们看到您的源代码,以及多少表现很重要。 – theheadofabroom 2011-03-20 19:28:20

0

我认为在可执行文件中嵌入的解释仍然会寻找在同一目录和/或PYTHONPATH .py文件,py2exe使用原生的Python组件的zip文件,IIRC pyinstaller嵌入他们都在执行,也许有在py2exe中保留一个压缩文件的选项(或者不在规范中添加它们),然后尝试运行应用程序而不使用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 toc以查看它们是否包含在内,我设法在Analysis()中使用excludes = [myfile0]来排除它们。