Tener py2exe incluye mis archivos de datos (como include_package_data)

Tengo una aplicación de Python que incluye archivos de datos que no son de Python en algunos de sus subpaquetes. He estado usando la opción include_package_data en mi setup.py para incluir todos estos archivos automáticamente al hacer distribuciones. Funciona bien.

Ahora estoy empezando a usar py2exe. Esperaba que viera que include_package_data=True e incluyera todos los archivos. Pero no lo hace. Pone solo mis archivos de Python en library.zip , así que mi aplicación no funciona.

¿Cómo hago para que py2exe incluya mis archivos de datos?

Terminé resolviéndolo dando a py2exe la opción skip_archive=True . Esto hizo que pusiera los archivos de Python no en library.zip sino simplemente como archivos sin formato. Luego data_files archivos de datos para colocar los archivos de datos dentro de los paquetes de Python.

include_package_data es una opción de setuptools, no una distutils. En los distritos clásicos, debe especificar la ubicación de los archivos de datos mediante la data_files = [] . py2exe es el mismo. Si tiene muchos archivos, puede usar glob o os.walk para recuperarlos. Vea, por ejemplo, los cambios adicionales (adiciones de archivos de datos) necesarios para setup.py para hacer que un módulo como MatPlotLib funcione con py2exe.

También hay una discusión de la lista de correo que es relevante.

Esto es lo que uso para hacer que py2exe incluya todos mis archivos en el .zip. Tenga en cuenta que para acceder a sus archivos de datos, debe abrir el archivo zip. py2exe no redireccionará las llamadas por ti.

 setup(windows=[target], name="myappname", data_files = [('', ['data1.dat', 'data2.dat'])], options = {'py2exe': { "optimize": 2, "bundle_files": 2, # This tells py2exe to bundle everything }}, ) 

La lista completa de opciones de py2exe está aquí .

He podido hacer esto anulando una de las funciones de py2exe y luego insertándolas en el archivo zip creado por py2exe.

Aquí hay un ejemplo:

 import py2exe import zipfile myFiles = [ "C:/Users/Kade/Documents/ExampleFiles/example_1.doc", "C:/Users/Kade/Documents/ExampleFiles/example_2.dll", "C:/Users/Kade/Documents/ExampleFiles/example_3.obj", "C:/Users/Kade/Documents/ExampleFiles/example_4.H", ] def better_copy_files(self, destdir): """Overriden so that things can be included in the library.zip.""" #Run function as normal original_copy_files(self, destdir) #Get the zipfile's location if self.options.libname is not None: libpath = os.path.join(destdir, self.options.libname) #Re-open the zip file if self.options.compress: compression = zipfile.ZIP_DEFLATED else: compression = zipfile.ZIP_STORED arc = zipfile.ZipFile(libpath, "a", compression = compression) #Add your items to the zipfile for item in myFiles: if self.options.verbose: print("Copy File %s to %s" % (item, libpath)) arc.write(item, os.path.basename(item)) arc.close() #Connect overrides original_copy_files = py2exe.runtime.Runtime.copy_files py2exe.runtime.Runtime.copy_files = better_copy_files 

Tengo la idea de aquí , pero desafortunadamente, py2exe ha cambiado la forma en que hacen las cosas con sentido. Espero que ésto ayude a alguien.