【问题标题】:A single executable file with Py2Exe带有 Py2Exe 的单个可执行文件
【发布时间】:2013-11-20 20:26:58
【问题描述】:

我一直在尝试制作一个可执行文件,但我已经接近了。请不要推荐我使用 PyInstaller——我已经尝试过这条路线,在 SO here 上询问过,并且已经提交了票证。它很接近但不太有效。我现在正在尝试 py2exe 并且也非常接近。在 pyinstaller 中,我可以创建资源文件(它构建包含文件的可执行文件——然后我可以在临时文件夹中访问这些文件)。

我想对 py2exe 做同样的事情。我有一个可执行文件,但有五个额外的文件夹(maps、mpl-data、data、pics 和 tcl)。我看过这个question,但似乎无法理解它,也无法让它发挥作用。在我的主 py 文件中,我使用PersistentDict(filepath),这是我需要文件路径的地方。

我的问题是两个部分: 1. 我如何将文件(下面的数据文件)打包到可执行文件中。 2. 如何在我的代码中访问这些文件并返回它们的路径(作为字符串),例如 /temp/file1.jpg。

这是我的 py2exe 设置文件的代码——请注意,我有 matplotlib 并且必须在我的可执行文件中正确包含 mpl 数据。谢谢!

from distutils.core import setup 
import py2exe 
import shutil
import glob 
import matplotlib,six

opts = {'py2exe': { "includes" : ["matplotlib.backends",
                                  "matplotlib.backends.backend_qt4agg",
                                  "matplotlib.figure","numpy",
                                  "six",
                                  "mpl_toolkits.basemap", 
                                  "matplotlib.backends.backend_tkagg"], 
                     'excludes': ['_gtkagg', '_tkagg','_agg2','_cairo',
                                  '_cocoaagg', '_fltkagg', '_gtk', '_gtkcairo', 'tcl' ], 
                 'dll_excludes': ['libgdk-win32-2.0-0.dll','w9xpopen.exe', 
                                 'libgobject-2.0-0.dll'],
                    'bundle_files': 1,
                    'dist_dir': "Dist Folder",
                    'compressed': True,
              } 
       }

data_files = [(r'mpl-data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\*.*')),
              (r'mpl-data', [r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\matplotlibrc']), 
              (r'mpl-data\images',glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\images\*.*')), 
              (r'mpl-data\fonts',glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\fonts\*.*')),
              (r'mpl-data\data', glob.glob(r'C:\Python27\Lib\site-packages\matplotlib\mpl-data\data\*.*')),
              ('data', ['C:\\Users\\Me\\Documents\\Example_Json_File.json']),
              ('pics', ['C:\\Users\\Me\\Documents\\Example_Icon.ico',
                        'C:\\Users\\Me\\Documents\\Example_Jpg.jpg',
                        ])]


setup(windows=[{"script" : "MyMainScript.py",
                "data_files" : data_files,
                "icon_resources": [(1, 'C:\\Users\\Me\\Documents\\Example_Icon.ico')]}, ],

                version = "1.0", 
                options=opts,
                data_files=data_files,
                zipfile = None,
      ) 

【问题讨论】:

  • 你试过IExpress吗?它最初是为安装设备驱动程序和 IE 6(不寒而栗)而设计的,但我之前曾为您的用例滥用过它。
  • 我不认为这是我想要的。我正在使用与此类似的 Inno Setup。当我将可执行文件(或安装程序)提供给另一个用户时,我希望他们只有一个可执行文件——没有与之关联的文件,他们可以看到/更改(因此文件被构建到可执行文件中)。
  • 那么您到底希望可执行文件做什么?您是否希望它 1) 将自身解压缩到临时文件夹中,2) 运行您的程序,3) 当程序完成时,删除临时文件?这就是 IExpress 所做的。
  • 好的——让我更深入地研究一下。用户是否有办法查看提取的文件(这主要是我要避免的)。

标签: python python-2.7 matplotlib executable py2exe


【解决方案1】:

Guy here 解释了如何使用 py2exe 打包到一个文件中。他的设置也没有将资源打包到可执行文件中。

当我打包我的应用程序时,我不使用一个可执行选项

options = {"py2exe": {'bundle_files': 1, 'compressed': True}},

甚至懒得把它们放在 library.zip 中

options = {"py2exe": {"skip_archive":0}}

只需在一个目录中包含许多 pyc、数据文件、dll 等。然后使用 NSIS 或 Inno 设置创建安装程序。由于我的一些应用程序必须作为服务运行,Inno 正在处理这个问题。 这种方法的最大优点是,您不必处理与原始路径不同的文件“冻结”路径。

否则,您可能需要更改代码以检测冻结路径,例如http://www.py2exe.org/index.cgi/WhereAmI

【讨论】:

  • 这就是我现在的做法。但是,这并没有给我一个可执行文件——我必须包含文件夹。我确实想要冰冻的路径——这就是我挣扎的地方。我似乎无法将实际文件放入可执行文件中,然后能够解决它们的冻结路径。
【解决方案2】:

我见过一个批处理到 EXE 转换器(高级批处理到 EXE 转换器)这样做,但是以一种奇怪的方式:它可以让您将文件放在“烘焙”目录中,并且可以通过“ %MYFILES%\[path]" 目录/变量。如果你有一些回旋的空间,看看这个。唯一的问题是它会在文件中添加一个“介绍”(阅读:美化的 Flash 动画),并且它会显示 FIRST。 (我反对盗版,但在这里我可以接受......“介绍”是 45 秒长 并且令人讨厌。)

如果这没有困扰您,请尝试一下。

【讨论】:

    猜你喜欢
    • 2010-09-11
    • 2014-03-17
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    相关资源
    最近更新 更多