2008-09-22 26 views
127

Creí haber escuchado que py2exe fue capaz de hacer esto, pero nunca lo descubrí. ¿Alguien ha hecho esto con éxito? ¿Puedo ver su archivo setup.py y las opciones de línea de comando que utilizó?py2exe - generar solo archivo ejecutable

Básicamente estoy pensando en darme un solo archivo ejecutable que hace algo como descomprimir a quizás/temp y se ejecuta.

+0

se aplica esto a Python 3, o versiones posteriores a pitón 2? – Vincent

Respuesta

94

PyInstaller creará un único archivo .exe sin dependencias; use la opción --onefile. Hace esto empaquetando todas las librerías compartidas necesarias en el ejecutable, y desempaquetarlas antes de que se ejecute, tal como lo describe (EDIT: py2exe también tiene esta característica, vea minty's answer)

Utilizo la versión de PyInstaller de svn, ya que la última versión (1.3) está algo desactualizada. Ha funcionado muy bien para una aplicación que depende de PyQt, PyQwt, numpy, scipy y algunos más.

+3

Encontré que py2exe funcionaba mucho mejor que pyInstaller, cuando estás usando huevos. la respuesta de Minty es la solución. – gbjbaanb

+0

Tenga en cuenta que a partir de la versión 1.4, PyInstaller no es compatible con Python 2.6+ en Windows – Joril

+2

Ahora estoy usando la versión 1.5.1, y funciona con Python 2.7.2. – oob

-5

No, no le da un ejecutable único en el sentido de que solo tiene un archivo después, pero tiene un directorio que contiene todo lo que necesita para ejecutar su programa, incluido un archivo exe.

Acabo de escribir this setup.py hoy. Solo necesita invocar python setup.py py2exe.

+1

Esto no es exacto. Con las opciones correctas, puede obtener un archivo independiente. –

+0

@Torsten Marek ... el enlace a su setup.py está muerto. En particular ... las dos primeras repectivas terminan promoviendo cosas comerciales. La tercera vez termina [aquí] (http://ww1.diotavelli.net/?sub1=41f7fc3c-0080-11e8-8512-e8d570006125) en el callejón sin salida de internet. – ZF007

-2

Recientemente utilicé py2exe para crear un ejecutable para la revisión posterior para enviar revisiones a ReviewBoard.

Este fue el setup.py Solía ​​

from distutils.core import setup 
import py2exe 

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

Se creó un directorio que contiene el archivo ejecutable y las bibliotecas necesarias. No creo que sea posible usar py2exe para obtener solo un archivo .exe. Si lo necesita, primero deberá usar py2exe y luego usar alguna forma de instalador para hacer el ejecutable final.

Una cosa que debes tener en cuenta es que cualquier archivo de huevos que uses en tu aplicación debe descomprimirse, de lo contrario, py2exe no podrá incluirlos. Esto está cubierto en los documentos py2exe.

161

La manera de hacerlo utilizando py2exe es usar la opción bundle_files en su archivo setup.py. Para un único archivo, deberá establecer bundle_files en 1, compressed en True y establecer la opción de archivo zip en Ninguno. De esta forma, crea un archivo comprimido para facilitar la distribución.

Aquí se presenta una descripción más completa de la opción bundle_file citado directamente de la py2exe site *

Using "bundle_files" and "zipfile"

An easier (and better) way to create single-file executables is to set bundle_files to 1 or 2, and to set zipfile to None. This approach does not require extracting files to a temporary location, which provides much faster program startup.

Valid values for bundle_files are:

  • 3 (default) don't bundle
  • 2 bundle everything but the Python interpreter
  • 1 bundle everything, including the Python interpreter

If zipfile is set to None, the files will be bundle within the executable instead of library.zip.

que aquí hay una muestra de 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, 
) 
+0

¿es posible crear un solo archivo, que depende del dll de python? No me importa 1 exe + 1 dll (ya que el dll se puede instalar en una ubicación común), siempre y cuando todos los pequeños archivos de dependencia estén ocultos en el exe. – gbjbaanb

+5

Claro, si solo quiere el intérprete no incluido, elija 2 para la opción bundle_files. ¡Buena suerte! – minty

+12

Tenga en cuenta que bundle_files 1 no es compatible con amd64 (py2exe 0.6.9 para Python 2.6 al menos) – Joril

13

Como el otro cartel mención, py2exe, generará un ejecutable + algunas bibliotecas para cargar. También puede tener algunos datos para agregar a su programa.

El siguiente paso es usar un instalador, para empaquetar todo esto en un programa fácil de usar instalable/no seleccionable.

He utilizado InnoSetup (http://www.jrsoftware.org/isinfo.php) con gusto desde hace varios años y para programas comerciales, así que lo recomiendo encarecidamente.

+0

+1 para indicar que después de py2exe todavía hay cosas para empacar – joaquin

1

Me dicen bbfreeze creará un único archivo .EXE, y es más nuevo que py2exe.

+3

Por lo que puedo entender, bbfreeze no produce archivos ejecutables de un solo archivo. ¿Podrías documentar tu respuesta? – joaquin

4

Debe crear un instalador, como se mencionó anteriormente. Aunque también es posible permitir que py2exe agrupe todo en un único ejecutable, estableciendo la opción bundle_files en 1 y el argumento de la palabra clave zipfile en None, no lo recomiendo para las aplicaciones PyGTK.

Esto se debe a que GTK + intenta cargar sus archivos de datos (locales, temas, etc.) desde el directorio desde el que se cargó. Por lo tanto, debe asegurarse de que el directorio de su archivo ejecutable contenga también las bibliotecas utilizadas por GTK + y los directorios lib, share y etc. de su instalación de GTK +. De lo contrario, tendrá problemas para ejecutar su aplicación en una máquina donde GTK + no está instalado en todo el sistema.

Para obtener más información, lea mi guide to py2exe for PyGTK applications. También explica cómo agrupar todo, pero GTK +.

4

He podido crear un solo archivo exe con todos los recursos incrustados en el exe. Estoy construyendo en Windows. entonces eso explicará algunas de las llamadas al sistema operativo que estoy usando.

Primero intenté convertir todas mis imágenes en bitmats y luego todos mis archivos de datos en cadenas de texto. pero esto hizo que el exe final fuera muy grande.

Después de buscar en Google durante una semana descubrí cómo alterar la secuencia de comandos py2exe para satisfacer mis necesidades.

aquí está el parche de sourceforge que envié, por favor publique comentarios para que podamos incluirlo en la próxima distribución.

http://sourceforge.net/tracker/index.php?func=detail&aid=3334760&group_id=15583&atid=315583

este explanes todos los cambios realizados, simplemente he añadido una nueva opción para la línea de configuración. aquí está mi setup.py.

intentaré comentarlo lo mejor que pueda. Tenga en cuenta que mi setup.py es complejo para el hecho de que tengo acceso a las imágenes por nombre de archivo. así que debo almacenar una lista para hacer un seguimiento de ellos.

esto es de un protector de pantalla want-to-b que estaba tratando de hacer.

Utilizo exec para generar mi configuración en tiempo de ejecución, es más fácil de cortar y pegar de esa manera.

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]) 

desglose

script = guión py quiero dar vuelta a un exe

icon_resources = el icono del exe

file_resources = Archivos quiero integrar en el exe

other_resources = una cadena para incrustar en el exe, en este caso una lista de archivos.

opciones = Opciones py2exe para la creación de todo en un archivo exe

bitmap_strings = una lista de archivos para incluir

Tenga en cuenta que file_resources no es una opción válida hasta que usted edite su archivo como se describe py2exe.py en el enlace de arriba

primera vez que he tratado de publicar el código en este sitio, si lo hago mal no me llame.

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" 

bien, eso es todo para el setup.py ahora la magia necesita acceder a las imágenes. Desarrollé esta aplicación sin py2exe en mente y luego la agregué más tarde. para que pueda ver el acceso en ambas situaciones. si no se puede encontrar la carpeta de imágenes , intenta extraer las imágenes de los recursos exe. el código lo explicará. esto es parte de mi clase de sprite y usa un directx. pero puede usar cualquier API que desee o simplemente acceder a los datos brutos. no importa.

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

Cualquier pregunta es gratuita.

+0

He intentado su método y funciona bien, pero no subestimo y cómo agregar el archivo a la opción file_resurces para incrustar algún archivo en .exe. He modificado el archivo build_exe.py como dijiste, pero cuando ingreso al archivo setup.py y escribo '\ 'file_resources': [('txt2.txt')]' me da error (el archivo que quiero incrustar en mi .exe se llama txt2 y es un archivo .txt) – Vinciuz

Cuestiones relacionadas