2013-11-08 4 views
11

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

Я хочу сделать то же самое для py2exe. У меня есть один исполняемый файл, но пять дополнительных папок (карты, mpl-данные, данные, фотографии и 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, 
    ) 
+0

Вы пробовали [IExpress] (https://en.wikipedia.org/wiki/IExpress)? Он был первоначально разработан для установки драйверов устройств и IE 6 (содрогание), но я злоупотреблял им раньше для вашего примера использования. –

+0

Я не думаю, что это то, что я хочу. Я использую Inno Setup, который похож на этот. Когда я передаю исполняемый файл (или установщик) другому пользователю, я хочу, чтобы у них был только исполняемый файл - нет связанных с ним файлов, которые они могли видеть/изменять (таким образом, файлы встроены в исполняемый файл). – mcfly

+0

Итак, что именно вы хотите выполнить исполняемый файл? Вы хотите, чтобы: 1) извлечь себя во временную папку, 2) запустить вашу программу, 3) когда программа закончится, удалите временные файлы? Это то, что делает IExpress. –

ответ

4

Guy here объясняет, как упаковать в один файл с py2exe. Он не устанавливает пакеты внутри исполняемого файла.

Когда я упаковать свои приложения, я не использую один исполняемый вариант

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

даже не удосужился поставить их в library.zip через

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

Просто ряд ВПГ-х годов, файлы данных, dll и т. д. в одном каталоге. Затем создайте установщик, используя NSIS или установку Inno. Поскольку некоторые из моих приложений должны работать как службы, Inno заботился об этом. Самый большой плюс этого подхода, вам не нужно иметь дело с «замороженными» путями к вашим файлам, которые отличаются от ваших исходных путей.

В противном случае может потребоваться изменить код для обнаружения замороженных путей, например. http://www.py2exe.org/index.cgi/WhereAmI

+0

Вот как я это делаю сейчас. Однако это не дает мне одного исполняемого файла - я должен включать в него папки. Я хочу замороженные пути - вот где я боюсь. Кажется, я не могу получить фактические файлы в исполняемом файле, а затем смогу обратиться к их замороженным путям. – mcfly

0

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

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

Смежные вопросы