py2exe — создать один исполняемый файл
Вопрос
мне показалось, что я это услышал py2exe смог это сделать, но так и не понял.Кто-нибудь успешно сделал это?Могу ли я увидеть ваш файл setup.py и какие параметры командной строки вы использовали?
По сути, я думаю о том, чтобы получить один исполняемый файл, который что-то вроде разархивирует себя в /temp и запускается.
Решение
PyInstaller создаст один файл .exe без каких-либо зависимостей;использовать --onefile
вариант.Он делает это, упаковывая все необходимые общие библиотеки в исполняемый файл и распаковывая их перед запуском, как вы описываете (EDIT:py2exe также имеет эту функцию, см. ответ Минти)
Я использую версию PyInstaller от svn, так как последний релиз (1.3) несколько устарел.Это работает очень хорошо для приложения, которое зависит от PyQt, PyQwt, numpy, scipy и некоторых других.
Другие советы
Способ сделать это с помощью py2exe — использовать параметр Bundle_files в файле setup.py.Для одного файла вы захотите установить bundle_files
до 1, compressed
значение True и установите для параметра zipfile значение None.Таким образом, он создает один сжатый файл для удобства распространения.
Вот более полное описание опции Bundle_file, указанное непосредственно в сайт py2exe*
Использование «bundle_files» и «zipfile»
Более простым (и лучшим) способом создания однолетних исполняемых файлов является установка Bundle_files на 1 или 2 и установить на Zipfile на нет.Этот подход не требует извлечения файлов во временное место, которое обеспечивает гораздо более быстрый запуск программы.
Допустимые значения для Bundle_files:
- 3 (по умолчанию) не объединять
- 2. Соберите все, кроме интерпретатора Python.
- 1 пакет всего, включая интерпретатор Python
Если Zipfile не установлен ни на нет, файлы будут объединяться в исполняемом файле вместо Library.zip.
Вот пример файла setup.py:
from distutils.core import setup
import py2exe, sys, os
sys.argv.append('py2exe')
setup(
options = {'py2exe': {'bundle_files': 1, 'compressed': True}},
windows = [{'script': "single.py"}],
zipfile = None,
)
Как упоминалось в другом постере, py2exe сгенерирует исполняемый файл + несколько библиотек для загрузки.Вы также можете добавить некоторые данные в свою программу.
Следующий шаг — использовать установщик, чтобы упаковать все это в одну простую в использовании программу, которую можно установить или удалить.
Я использовал InnoSetup ( http://www.jrsoftware.org/isinfo.php ) с удовольствием уже несколько лет и для коммерческих программ, так что от всей души рекомендую.
Как упоминалось ранее, вам следует создать установщик.Хотя также возможно позволить py2exe объединить все в один исполняемый файл, установив для параметра Bundle_files значение 1, а для аргумента ключевого слова zipfile — значение None, я не рекомендую это для приложений PyGTK.
Это связано с тем, что GTK+ пытается загрузить свои файлы данных (локальные файлы, темы и т. д.) из каталога, из которого он был загружен.Поэтому вам необходимо убедиться, что каталог вашего исполняемого файла содержит также библиотеки, используемые GTK+, а также каталоги lib,share и т. д. из вашей установки GTK+.В противном случае у вас возникнут проблемы с запуском вашего приложения на машине, где GTK+ не установлен общесистемно.
Подробности читайте в моем руководство по py2exe для приложений PyGTK.Здесь также объясняется, как объединить все, кроме GTK+.
Мне удалось создать один exe-файл со всеми ресурсами, встроенными в exe.Я строю на окнах.так что это объяснит некоторые вызовы os.system, которые я использую.
Сначала я попытался преобразовать все изображения в растровые изображения, а затем все файлы данных в текстовые строки.но из-за этого окончательный exe-файл оказался очень-очень большим.
Погуглив неделю, я понял, как изменить скрипт py2exe в соответствии с моими потребностями.
Вот ссылка на патч на Sourceforge, которую я отправил, пожалуйста, опубликуйте комментарии, чтобы мы могли включить ее в следующее распространение.
http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583
это объясняет все внесенные изменения, я просто добавил новую опцию в строку настройки.вот мой setup.py.
я постараюсь прокомментировать это как можно лучше.Имейте в виду, что мой файл setup.py сложен из-за того, что я получаю доступ к изображениям по имени файла.поэтому мне нужно сохранить список, чтобы отслеживать их.
это из заставки «Хочу-б», которую я пытался сделать.
Я использую exec для создания настроек во время выполнения, так проще вырезать и вставлять.
exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
options={'py2exe': py2exe_options},\
zipfile = None )" % (bitmap_string[:-1])
авария
script = py скрипт, который я хочу превратить в exe
icon_resources = значок exe-файла
file_resources = файлы, которые я хочу встроить в exe
Other_resources = строка для встраивания в exe, в данном случае список файлов.
options = параметры py2exe для создания всего в одном exe-файле
bitmap_strings = список файлов для включения
Обратите внимание, что file_resources не является допустимым параметром, пока вы не отредактируете файл py2exe.py, как описано в ссылке выше.
Я впервые пытаюсь разместить код на этом сайте, если я ошибусь, не обижайте меня.
from distutils.core import setup
import py2exe #@UnusedImport
import os
#delete the old build drive
os.system("rmdir /s /q dist")
#setup my option for single file output
py2exe_options = dict( ascii=True, # Exclude encodings
excludes=['_ssl', # Exclude _ssl
'pyreadline', 'difflib', 'doctest', 'locale',
'optparse', 'pickle', 'calendar', 'pbd', 'unittest', 'inspect'], # Exclude standard library
dll_excludes=['msvcr71.dll', 'w9xpopen.exe',
'API-MS-Win-Core-LocalRegistry-L1-1-0.dll',
'API-MS-Win-Core-ProcessThreads-L1-1-0.dll',
'API-MS-Win-Security-Base-L1-1-0.dll',
'KERNELBASE.dll',
'POWRPROF.dll',
],
#compressed=None, # Compress library.zip
bundle_files = 1,
optimize = 2
)
#storage for the images
bitmap_string = ''
resource_string = ''
index = 0
print "compile image list"
for image_name in os.listdir('images/'):
if image_name.endswith('.jpg'):
bitmap_string += "( " + str(index+1) + "," + "'" + 'images/' + image_name + "'),"
resource_string += image_name + " "
index += 1
print "Starting build\n"
exec "setup(console=[{'script': 'launcher.py', 'icon_resources': [(0, 'ICON.ico')],\
'file_resources': [%s], 'other_resources': [(u'INDEX', 1, resource_string[:-1])]}],\
options={'py2exe': py2exe_options},\
zipfile = None )" % (bitmap_string[:-1])
print "Removing Trash"
os.system("rmdir /s /q build")
os.system("del /q *.pyc")
print "Build Complete"
Хорошо, это для Setup.py Теперь волшебство, необходимое для доступа к изображениям.Я разработал это приложение, не имея в виду py2exe, а затем добавил его позже.так что вы увидите доступ для обеих ситуаций.Если папка изображения не может быть найдена, она пытается вытащить изображения из ресурсов EXE.код объяснит это.это часть моего класса спрайтов, и он использует DirectX.но вы можете использовать любой API или просто получить доступ к необработанным данным.не имеет значения.
def init(self):
frame = self.env.frame
use_resource_builtin = True
if os.path.isdir(SPRITES_FOLDER):
use_resource_builtin = False
else:
image_list = LoadResource(0, u'INDEX', 1).split(' ')
for (model, file) in SPRITES.items():
texture = POINTER(IDirect3DTexture9)()
if use_resource_builtin:
data = LoadResource(0, win32con.RT_RCDATA, image_list.index(file)+1) #windll.kernel32.FindResourceW(hmod,typersc,idrsc)
d3dxdll.D3DXCreateTextureFromFileInMemory(frame.device, #Pointer to an IDirect3DDevice9 interface
data, #Pointer to the file in memory
len(data), #Size of the file in memory
byref(texture)) #ppTexture
else:
d3dxdll.D3DXCreateTextureFromFileA(frame.device, #@UndefinedVariable
SPRITES_FOLDER + file,
byref(texture))
self.model_sprites[model] = texture
#else:
# raise Exception("'sprites' folder is not present!")
Любые вопросы можно было задавать.
Мне сказали bbfreeze создаст один файл .EXE, новее, чем py2exe.
пытатьсяc_x заморозитьон может создать хороший автономный
Недавно я использовал py2exe для создания исполняемого файла для пост-ревью для отправки обзоров в ReviewBoard.
Это был файл setup.py, который я использовал
from distutils.core import setup
import py2exe
setup(console=['post-review'])
Он создал каталог, содержащий exe-файл и необходимые библиотеки.Я не думаю, что можно использовать py2exe для получения только одного файла .exe.Если вам это нужно, вам нужно сначала использовать py2exe, а затем использовать какую-либо форму установщика, чтобы создать окончательный исполняемый файл.
Следует позаботиться о том, чтобы все файлы egg, которые вы используете в своем приложении, должны быть разархивированы, иначе py2exe не сможет их включить.Это описано в документации py2exe.
Нет, он не дает вам ни одного исполняемого файла в том смысле, что после этого у вас будет только один файл - но у вас есть каталог, который содержит все, что вам нужно для запуска вашей программы, включая exe-файл.
я только что написал этот setup.py сегодня.Вам нужно только вызвать python setup.py py2exe
.