py2exe-создание одного исполняемого файла

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

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

9 ответов


PyInstaller будет создан один .exe-файл без зависимостей; используйте . Он делает это, упаковывая все необходимые общие библиотеки в исполняемый файл и распаковывая их перед запуском, как вы описываете (EDIT: py2exe также имеет эту функцию, см. Минти!--3-->)

Я использую версию 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 и установить zip-файл нет. Такой подход не требует извлечения файлов в временное местоположение, которое обеспечивает гораздо быстрее запуск программы.

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

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

Если для zipfile задано значение None, файлы будут упакованы в исполняемом файле вместо библиотеки.застежка-молния.

вот пример 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, будет генерировать исполняемый файл + некоторые библиотеки для загрузки. Вы также можете добавить некоторые данные в свою программу.

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

Я использовал 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. Я строю на окнах. так что это объяснит некоторые из ОС.системные вызовы, которые я использую.

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

после googleing в течение недели я понял, как изменить скрипт 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 script я хочу обратиться к exe

icon_resources = значок для exe-файла

file_resources = файлы, которые я хочу встроить в exe

other_resources = a строка для вставки в 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. код объяснит это. это часть моего класса sprite, и он использует 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 freeze он может создать хороший автономный


недавно я использовал py2exe для создания исполняемого файла для post-review для отправки отзывов в 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.