使用Py2Exe的单个可执行文件

mcf*_*fly 11 python executable py2exe matplotlib python-2.7

我一直在尝试制作一个可执行文件,而我正在接近.请不要建议我使用PyInstaller - 我已经尝试过这条路线,在这里询问,并且已经订购了门票.它很接近但不太合适.我现在正在尝试py2exe,我也非常接近.在pyinstaller中,我能够创建资源文件(使用包含的文件构建可执行文件 - 然后我可以在临时文件夹中访问这些文件).

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

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

这是我的py2exe安装文件的代码 - 注意我有matplotlib,必须在我的可执行文件中正确包含mpl-data.谢谢!

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,
      ) 
Run Code Online (Sandbox Code Playgroud)

Dmi*_*riy 4

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

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

options = {"py2exe": {'bundle_files': 1, 'compressed': True}},
Run Code Online (Sandbox Code Playgroud)

甚至懒得将它们放入library.zip中

options = {"py2exe": {"skip_archive":0}}
Run Code Online (Sandbox Code Playgroud)

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

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