py2exe - генерирует один исполняемый файл

141

Я думал, что слышал, что py2exe был в состоянии сделать это, но я так и не понял. Кто-нибудь успешно сделал это? Могу ли я увидеть ваш файл setup.py и какие параметры командной строки вы использовали?

По сути, я думаю об этом, давая мне один исполняемый файл, который выполняет что-то вроде распаковки себя в возможно / temp и запускается.

Greg
источник
Это относится к Python 3 или версиям после Python 2?
Винсент

Ответы:

105

PyInstaller создаст один файл .exe без каких-либо зависимостей; используйте --onefileопцию. Это делается путем упаковки всех необходимых общих библиотек в исполняемый файл и распаковки их перед запуском, как вы описали (РЕДАКТИРОВАТЬ: py2exe также имеет эту функцию, см . Ответ Минти )

Я использую версию PyInstaller из SVN, так как последний выпуск (1.3) несколько устарел. Это работает очень хорошо для приложения, которое зависит от PyQt, PyQwt, numpy, scipy и некоторых других.

дР.
источник
5
Я обнаружил, что py2exe работает намного лучше, чем pyInstaller, когда вы используете яйца. Ответ Минти является решением.
gbjbaanb
Обратите внимание, что начиная с версии 1.4 PyInstaller не поддерживает Python 2.6+ в Windows
Joril
2
Я сейчас использую версию 1.5.1, и она работает с Python 2.7.2.
2012 г.
1
py2exe может создать отдельный исполняемый файл, если вы укажете несколько аргументов в программе компилятора. У py2exe есть учебник для исполняемых файлов с одним файлом онлайн.
trevorKirkby
2
Объективная точка зрения: я не вижу, как это приемлемый ответ, поскольку он не решает вопрос о создании одного exe-файла с py2exe. (Тем не менее, это полезный ответ, конечно.)
Джонатан Комар
171

Способ сделать это с помощью py2exe - использовать параметр bundle_files в вашем файле setup.py. Для отдельного файла вам нужно установить bundle_filesзначение 1, compressedзначение True и установить для параметра zipfile значение None. Таким образом, он создает один сжатый файл для удобного распространения.

Вот более полное описание опции bundle_file, цитируемой непосредственно с сайта py2exe *

Использование "bundle_files" и "zipfile"

Более простой (и лучший) способ создания однофайловых исполняемых файлов - установить для bundle_files значение 1 или 2, а для zipfile - значение None. Этот подход не требует извлечения файлов во временную папку, что обеспечивает гораздо более быстрый запуск программы.

Допустимые значения для bundle_files:

  • 3 (по умолчанию) не связывать
  • 2 в комплекте все, кроме интерпретатора Python
  • 1 связка всего, включая интерпретатор Python

Если для zipfile установлено значение None, файлы будут объединяться в исполняемом файле, а не в 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,
)
мятный
источник
5
Конечно, если вы хотите, чтобы только интерпретатор не был в комплекте, выберите 2 для опции bundle_files. Удачи!
minty
13
Обратите внимание, что bundle_files 1 не поддерживается на amd64 (py2exe 0.6.9 для Python 2.6 как минимум)
Joril
2
@Pat: вызов для запуска py2exe "python setup.py py2exe". Автоматическое добавление «py2exe» в конце означает, что вам не нужно вводить его в командной строке.
orlade
2
Не совсем один исполняемый файл, как вам нужно установить Визуальная выполнения C DLL Microsoft .
Кевин Смит,
2
У меня было консольное приложение, которое я хотел иметь как один исполняемый файл. Я должен был заменить windows = [{'script': "single.py"}]с console = ['single.py']таким двойным щелчком файл откроется в окне CMD в Windows.
Джефф Б
13

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

Следующим шагом является использование установщика, чтобы упаковать все это в одну простую в использовании устанавливаемую / неустановляемую программу.

Я использовал InnoSetup ( http://www.jrsoftware.org/isinfo.php ) с удовольствием в течение нескольких лет и для коммерческих программ, поэтому я от всей души рекомендую его.

Филипп Ф
источник
+1 за указание, что после py2exe все еще есть вещи для упаковки.
Хоакин
6

Я был в состоянии создать один исполняемый файл со всеми ресурсами, встроенными в исполняемый файл. Я строю на окнах. так что это объяснит некоторые из вызовов os.system, которые я использую.

Сначала я попытался преобразовать все мои изображения в битовые биты, а затем все мои файлы данных в текстовые строки. но это привело к тому, что конечный файл был очень очень большой.

После недели поиска в Google я понял, как изменить скрипт 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 опции для создания всего в один исполняемый файл

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!")

Любые вопросы не стеснялись задавать.

ни
источник
Я попробовал ваш метод, и он работает хорошо, но я не понимаю, как добавить файл в опцию file_resurces, чтобы вставить какой-то файл в .exe. Я изменил файл build_exe.py, как вы сказали, но когда я захожу в файл setup.py и пишу, \'file_resources': [('txt2.txt')]он выдает ошибку (файл, который я хочу обозначить в моем .exe, называется txt2, и это файл .txt )
VinceLomba
Вы говорили о том, как вы преобразовали все ваши изображения в битовые биты, а затем все ваши файлы данных в текстовые строки. Даже если вы сказали, что это делает exe-файл большим, это работает, и если да, можете ли вы сказать мне, как это сделать? Я знаю, что этот ответ довольно старый, но если вы можете ответить, это будет оценено.
Пеппа
4

Вы должны создать установщик, как упоминалось ранее. Хотя можно также разрешить py2exe связывать все в один исполняемый файл, установив для параметра bundle_files значение 1, а для ключевого слова zipfile - None, я не рекомендую это для приложений PyGTK.

Это потому, что GTK + пытается загрузить свои файлы данных (локальные, темы и т. Д.) Из каталога, из которого он был загружен. Поэтому вы должны убедиться, что каталог вашего исполняемого файла содержит также библиотеки, используемые GTK +, и каталоги lib, share и т. Д. Из вашей установки GTK +. В противном случае у вас возникнут проблемы с запуском приложения на компьютере, где GTK + не установлен во всей системе.

Для более подробной информации прочитайте мое руководство по py2exe для приложений PyGTK . Это также объясняет, как связать все, кроме GTK +.

Себастьян Ноак
источник
1

Мне сказали, что bbfreeze создаст один файл .EXE и новее, чем py2exe.

ℳ.
источник
3
Насколько я понимаю, bbfreeze не создает однофайловые исполняемые файлы. Не могли бы вы документировать свой ответ?
Хоакин
-2

Недавно я использовал py2exe для создания исполняемого файла для пост-рецензирования для отправки рецензий на ReviewBoard.

Это был setup.py, который я использовал

from distutils.core import setup
import py2exe

setup(console=['post-review'])

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

Нужно позаботиться о том, чтобы любые файлы egg, которые вы используете в своем приложении, нужно было разархивировать, иначе py2exe не сможет их включить. Это описано в документации py2exe.

Дэвид Диббен
источник
-2

попробуйте c_x заморозить это может создать хороший автономный

Денис
источник
cx_Freeze не может создать отдельный исполняемый файл, фактически, документация для cx_Freeze на buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… говорит: «cx_Freeze не поддерживает создание одного файла exe, где все библиотеки для вашего приложения встроены в один исполняемый файл. " Для получения дополнительной информации об отдельных исполняемых файлах в cx_Freeze перейдите к документации ( buildmedia.readthedocs.org/media/pdf/cx-freeze/latest/… ) и перейдите к разделу 4.5.
Пеппа
-6

Нет, он не дает вам единственного исполняемого файла в том смысле, что у вас есть только один файл впоследствии - но у вас есть каталог, который содержит все необходимое для запуска вашей программы, включая exe-файл.

Я только что написал этот setup.py сегодня. Вам нужно только призвать python setup.py py2exe.

Торстен Марек
источник
1
Это не точно. При правильных настройках вы можете получить один автономный файл.
trevorKirkby
@ Торстен Марек ... ссылка на ваш setup.py не работает. В частности ... первые два переопределяют продвижение рекламы. В третий раз это заканчивается здесь, в тупике Интернета.
ZF007