python - online - Incluyendo PYDs/DLL en compilaciones py2exe
python to exe (4)
.pyd y .DLL son diferentes aquí, en el sentido de que un archivo .pyd debe ser encontrado automáticamente por el buscador de módulos y por lo tanto incluido (siempre que tenga la declaración de "importación" apropiada) sin necesidad de hacer nada. Si se pierde uno, usted hace lo mismo que si se omitiera un archivo .py (ambos son solo módulos): use la opción "incluir" para las opciones de py2exe.
Modulefinder no encontrará necesariamente dependencias en .DLLs (py2exe puede detectar algunos), por lo que puede necesitar incluirlos explícitamente, con la opción ''data_files''.
Por ejemplo, donde tenía que incluir dos .DLL (''foo.dll'' y ''bar.dll'') y tres .pyd (''module1.pyd'', ''module2.pyd'' y ''module3.pyd'') para incluir:
setup(name=''App'',
# other options,
data_files=[(''.'', ''foo.dll''), (''.'', ''bar.dll'')],
options = {"py2exe" : {"includes" : "module1,module2,module3"}}
)
Uno de los módulos de mi aplicación utiliza funciones de un archivo .pyd. Hay una opción para excluir dlls (exclude_dlls) pero ¿hay alguna para incluirlos? El proceso de compilación no parece copiar el .pyd en mi módulo a pesar de copiar el resto de los archivos (.py). También necesito incluir un .dll. ¿Cómo consigo py2exe para incluir archivos .pyd y .dll?
Puede modificar el script de instalación para copiar los archivos de forma explícita:
script = "PyInvaders.py" #name of starting .PY
project_name = os.path.splitext(os.path.split(script)[1])[0]
setup(name=project_name, scripts=[script]) #this installs the program
#also need to hand copy the extra files here
def installfile(name):
dst = os.path.join(''dist'', project_name)
print ''copying'', name, ''->'', dst
if os.path.isdir(name):
dst = os.path.join(dst, name)
if os.path.isdir(dst):
shutil.rmtree(dst)
shutil.copytree(name, dst)
elif os.path.isfile(name):
shutil.copy(name, dst)
else:
print ''Warning, %s not found'' % name
pygamedir = os.path.split(pygame.base.__file__)[0]
installfile(os.path.join(pygamedir, pygame.font.get_default_font()))
installfile(os.path.join(pygamedir, ''pygame_icon.bmp''))
for data in extra_data:
installfile(data)
etc ... modificar para satisfacer sus necesidades, por supuesto.
Si no se detectan automáticamente, intente copiarlos manualmente en el directorio de compilación temporal de py2exe. Se incluirán en el ejecutable final.
Tal vez podrías usar la opción data_files para setup ():
import glob
setup(name=''MyApp'',
# other options,
data_files=[(''.'', glob.glob(''*.dll'')),
(''.'', glob.glob(''*.pyd''))],
)
data_files debe ser una lista de tuplas, donde cada tupla contiene:
- El directorio objetivo
- Una lista de archivos para copiar.
Esto no pondrá los archivos en library.zip, lo que no debería ser un problema para dlls, pero no sé sobre archivos pyd.