py2exe – generar un archivo ejecutable único

Pensé que había oído que py2exe era capaz de hacer esto, pero nunca lo descubrí. ¿Alguien ha hecho con éxito esto? ¿Puedo ver su archivo setup.py y qué opciones de línea de comandos utilizó?

Básicamente, estoy pensando en que me dé un solo archivo ejecutable que haga algo así como descomprimirse en Tal vez / temp y se ejecute.

PyInstaller creará un único archivo .exe sin dependencias; use la opción --onefile . Lo hace empaquetando todas las librerías compartidas necesarias en el ejecutable y descomprimiéndolas antes de que se ejecute, tal como lo describe (EDIT: py2exe también tiene esta función, vea la respuesta de minty )

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

La forma de hacerlo utilizando py2exe es usar la opción bundle_files en su archivo setup.py. Para un solo archivo, querrá establecer bundle_files en 1, compressed en True, y configurar la opción zipfile en Ninguno. De esa manera crea un archivo comprimido para una fácil distribución.

Aquí hay una descripción más completa de la opción bundle_file citada directamente desde el sitio py2exe *

Usando “bundle_files” y “zipfile”

Una forma más fácil (y mejor) de crear archivos ejecutables de un solo archivo es establecer bundle_files en 1 o 2, y configurar el archivo zip en Ninguno. Este enfoque no requiere la extracción de archivos a una ubicación temporal, lo que proporciona un inicio de progtwig mucho más rápido.

Los valores válidos para bundle_files son:

  • 3 (predeterminado) no agrupar
  • 2 paquetes de todo menos el intérprete de Python
  • 1 paquete de todo, incluido el intérprete de Python

Si el archivo zip está configurado como Ninguno, los archivos se agruparán dentro del ejecutable en lugar de library.zip.

Aquí hay un ejemplo 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, ) 

Como lo menciona el otro póster, py2exe, generará un ejecutable + algunas bibliotecas para cargar. También puede tener algunos datos para agregar a su progtwig.

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

He utilizado InnoSetup ( http://www.jrsoftware.org/isinfo.php ) con deleite durante varios años y para progtwigs comerciales, por lo que lo recomiendo de todo corazón.

Debe crear un instalador, como se mencionó anteriormente. Aunque también es posible dejar que py2exe incluya todo en un solo ejecutable, configurando la opción bundle_files en 1 y el argumento de la palabra clave zipfile en Ninguno, 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 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 al ejecutar su aplicación en una máquina donde GTK + no está instalado en todo el sistema.

Para más detalles, lea mi guía de py2exe para aplicaciones PyGTK . También explica cómo agrupar todo, pero GTK +.

He podido crear un solo archivo exe con todos los recursos incrustados en el exe. Estoy construyendo en las ventanas. así que eso explicará algunas de las llamadas a os.system 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 muy grande.

Después de buscar en Google durante una semana, descubrí cómo modificar el script py2exe para satisfacer mis necesidades.

Aquí está el enlace del parche en 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

esto explica todos los cambios realizados, simplemente he agregado una nueva opción a 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 una tarea compleja debido al hecho de que accedo a las imágenes por nombre de archivo. así que debo guardar una lista para hacer un seguimiento de ellos.

esto es de un protector de pantalla que quiero hacer.

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

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

Descompostura

script = py script quiero recurrir a un exe

icon_resources = el icono para el exe

file_resources = archivos que quiero incrustar en el exe

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

options = py2exe opciones para crear 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 edite su archivo py2exe.py como se describe en el enlace anterior.

La primera vez que bash escribir el código en este sitio, si me equivoco, no me llames.

 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" 

ok, eso es todo para setup.py ahora la magia necesitaba acceder a las imágenes. Desarrollé esta aplicación sin tener en cuenta a py2exe y luego la añadí. Así verás el acceso para 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 sprites y usa un directx. pero puede utilizar cualquier api que desee o simplemente acceder a los datos en bruto. 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 no dudes en preguntar.

Me han dicho que bbfreeze creará un solo archivo .EXE, y es más nuevo que py2exe.

intente c_x congelarlo puede crear un buen standalone

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

Este fue el setup.py que utilicé

 from distutils.core import setup import py2exe setup(console=['post-review']) 

Creó un directorio que contenía el archivo exe y las bibliotecas necesarias. No creo que sea posible usar py2exe para obtener un solo archivo .exe. Si necesita, primero debe usar py2exe y luego usar alguna forma de instalador para hacer el ejecutable final.

Una cosa a tener en cuenta es que cualquier archivo de egg que uses en tu aplicación necesita ser descomprimido, de lo contrario, py2exe no puede incluirlos. Esto está cubierto en los documentos de py2exe.

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

Acabo de escribir este setup.py hoy. Solo necesitas invocar python setup.py py2exe .