2012-08-03 13 views
12

Esto ha llegado a algunas pocas veces en las listas de correo cx_FreezeMover todo el DLL y PYD a una subcarpeta con cx_Freeze

(ver

cx_Freeze and moving files around

Creating fewer files when freezing a Python application

cx_freeze python single file? )

y me parece que debería ser una solución simple, pero no puedo ver cómo comenzar.

Tengo una aplicación de Python que depende de scipy, wxpython, numpy y un montón de otros paquetes que tienen MUCHAS bibliotecas vinculadas dinámicamente. La carpeta principal ejecutable se llena de archivos PYD y DLL y es difícil incluso encontrar el ejecutable entre todos los archivos. Mis usuarios no son especialmente expertos en informática, por lo que la claridad es muy importante.

No necesito un solo ejecutable como teóricamente puede ser generado por bbfreeze. Me gusta cómo funciona el archivo distutils setup.py con cx_Freeze y de todos los modos cx_Freeze es bastante brillante.

Todo lo que quiero es una forma de limpiar la carpeta principal ejecutable. Me encantaría mover manualmente los archivos DLL a la carpeta freeze_libs o algo así y luego interferir con la ruta de carga de la biblioteca compartida para ayudarlo a encontrar las bibliotecas dinámicas, si eso es posible. O algo así.

Gracias

+0

Eche un vistazo a [ConsoleSetLibPath] (https://bitbucket.org/anthony_tuininga/cx_freeze/src/default/cx_Freeze/initscripts/ConsoleSetLibPath.py) initscript. Debería ser posible ajustar eso para buscar bibliotecas en una subcarpeta. –

+0

¿Cómo se usa ese script? Parece muy prometedor, pero no veo cómo integrarlo. – ibell

+0

Si está utilizando un script setup.py, especifique una opción 'init_script' para' build_exe' ([docs] (http://cx-freeze.readthedocs.org/en/latest/distutils.html # build-exe)). O si está utilizando el comando 'cxfreeze', hay un [--init-script flag] (http://cx-freeze.readthedocs.org/en/latest/script.html#cmdoption--init-script) . –

Respuesta

3

Entiendo su frustración. Lo que tiendo a hacer es tomar toda la carpeta de compilación y moverla al directorio de archivos de programa suponiendo que está usando una máquina de Windows. A continuación, cree un acceso directo en el escritorio para el ejecutable. Entonces generalmente cambio el ícono a algo agradable a la vista. En otras palabras, todos los archivos del sistema están ocultos y todo lo que queda es un solo icono de aspecto agradable en el escritorio.

3

"manual", pero ¿es esta la forma correcta? Estoy en cx_Freeze Win7 x64 4.3.2

mi init_script, combinados de Console.py y ConsoleSetLibPath.py

import encodings 
import os 
import sys 
import warnings 
import zipimport 

paths = os.environ.get("LD_LIBRARY_PATH", "").split(os.pathsep) 
if DIR_NAME not in paths: 
    paths.insert(0, DIR_NAME) 
    os.environ["LD_LIBRARY_PATH"] = os.pathsep.join(paths) 
    os.execv(sys.executable, sys.argv) 

sys.frozen = True 
sys.path = sys.path[:4] 

# i added this line 
sys.path.append(r'lib') 

os.environ["TCL_LIBRARY"] = os.path.join(DIR_NAME, "tcl") 
os.environ["TK_LIBRARY"] = os.path.join(DIR_NAME, "tk") 

m = __import__("__main__") 
importer = zipimport.zipimporter(INITSCRIPT_ZIP_FILE_NAME) 

# The following if/else is copied from ConsoleSetLibPath.py 
if INITSCRIPT_ZIP_FILE_NAME != SHARED_ZIP_FILE_NAME: 
    moduleName = m.__name__ 
else: 
    name, ext = os.path.splitext(os.path.basename(os.path.normcase(FILE_NAME))) 
    moduleName = "%s__main__" % name 

code = importer.get_code(moduleName) 
exec code in m.__dict__ 

versionInfo = sys.version_info[:3] 
if versionInfo >= (2, 5, 0) and versionInfo <= (2, 6, 4): 
    module = sys.modules.get("threading") 
    if module is not None: 
     module._shutdown() 

Entonces puedo guardar este archivo en C:\Python27\Lib\site-packages\cx_Freeze\initscripts como ConsoleSetLibPathx.py y en mi setup.py

setup(
    name = 'xxx', 
    version = '0.1', 
    options = {'build_exe': {'includes':includes, 
          'excludes':excludes, 
          'packages':packages, 
          'include_files':includefiles, 
          'create_shared_zip':True, 
          'include_in_shared_zip':True, 
           # use the "hacked" init_script ? 
          'init_script':'ConsoleSetLibPathx', 
          'include_msvcr':True, 
          } 

          }, 
    executables = [exe] 
) 

# Am i supposed to do the mkdir lib , and copy *.pyd *.dll into it in the end of this setup.py here? 
# I verified this is working by manually creating lib dir and copy all files inside, it works. 

, creo que debería hacerlo en las opciones, o en alguna parte, pero no entiendo del todo el documento cx_freeze en este momento. tal vez --target-dir o --default-path o --replace-paths? no estoy seguro de cómo usarlos

corregir: lo siento, esto necesita mejorar, cuando pruebo esto en otro win7 limpio en vmware, está funcionando pero está actuando raro, mi código de pulsación de teclas de lectura no bloqueada no está funcionando. no estoy seguro de qué parte está mal.

+0

No, no creo que haya una opción para hacer esto sin editar el script de inicio en este momento. –

+0

Por cierto, en la sección de la parte superior que modifica 'LD_LIBRARY_PATH', creo que es posible que necesite cambiar la línea' paths.insert (0, DIR_NAME) 'por' paths.insert (0, os.path.join (DIR_NAME) , 'lib')) '. Eso solo afecta los sistemas Unix, sin embargo. Para Windows, creo que es posible que necesite agregar el mismo directorio a la variable de entorno 'PATH'. –

+0

¿De dónde viene 'DIR_NAME'? Estoy obteniendo un error en la línea 'os.environ [" LD_LIBRARY_PATH "] = os.pathsep.join (paths)' porque el valor es demasiado largo. Esto parece extraño, porque en Windows debería ser 'lib', tres caracteres. – ToothlessRebel

Cuestiones relacionadas