Один исполняемый файл с Py2Exe

Я пытаюсь создать один исполняемый файл, и я приближаюсь. Пожалуйста, не рекомендуйте использовать PyInstaller - я пробовал этот маршрут, спросил SO здесь и поместил билеты. Он близок, но не совсем работает. Я теперь пытаюсь py2exe, и я тоже очень близко. В pyinstaller я могу создавать файлы ресурсов (который создает исполняемый файл с включенными файлами - я могу получить к ним доступ во временной папке).

Я хочу сделать то же самое для py2exe. У меня есть один исполняемый файл, но пять дополнительных папок (карты, mpl-данные, данные, фотографии и tcl). Я видел это question, но, похоже, не понял его и не смог его сработать. В моем основном файле py я использую PersistentDict(filepath), где мне нужен путь к файлу.

Мой вопрос состоит из двух частей: 1. Как получить файлы (файлы данных ниже), упакованные в исполняемый файл. 2. Как получить доступ к этим файлам в моем коде и вернуть их путь (в виде строки), например /temp/file 1.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,
      ) 

Ответ 1

Guy здесь объясняет, как упаковать файлы в файл с 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 (Advanced Batch to EXE Converter), но это странно: он позволит вам помещать файлы в каталог "bake", и их можно манипулировать с помощью "% MYFILES%\[путь]" каталог/переменная. Если у вас есть комната для маневра, проверьте это. Единственная проблема заключается в том, что он добавит в файл "intro" (чтение: прославленная флеш-анимация), и он отобразит FIRST. (Я против пиратства, но с ним все в порядке... "intro" 45 секунд и неприятный.)

Если это вас не испугает, попробуйте сделать снимок.