¿Cómo puedo agrupar otros archivos cuando se utiliza cx_Freeze?
Pregunta
Estoy usando Python 2.6 y 4.1.2 cx_Freeze en un sistema Windows. He creado el setup.py para construir mi bien ejecutable y todo funciona.
Cuando cx_Freeze corre, se mueve todo en el directorio build
. Tengo algunos otros ficheros que me gustaría incluir en mi directorio build
. ¿Cómo puedo hacer esto? Aquí está mi estructura:
src\
setup.py
janitor.py
README.txt
CHNAGELOG.txt
helpers\
uncompress\
unRAR.exe
unzip.exe
Aquí está mi fragmento:
configuración
( name='Janitor', version='1.0', description='Janitor', author='John Doe', author_email='john.doe@gmail.com', url='http://www.this-page-intentionally-left-blank.org/', data_files = [ ('helpers\uncompress', ['helpers\uncompress\unzip.exe']), ('helpers\uncompress', ['helpers\uncompress\unRAR.exe']), ('', ['README.txt']) ], executables = [ Executable\ ( 'janitor.py', #initScript ) ] )
Me parece que no puede conseguir que esto funcione. ¿Es necesario un archivo MANIFEST.in
?
Solución
descubierto.
from cx_Freeze import setup,Executable
includefiles = ['README.txt', 'CHANGELOG.txt', 'helpers\uncompress\unRAR.exe', , 'helpers\uncompress\unzip.exe']
includes = []
excludes = ['Tkinter']
packages = ['do','khh']
setup(
name = 'myapp',
version = '0.1',
description = 'A general enhancement utility',
author = 'lenin',
author_email = 'le...@null.com',
options = {'build_exe': {'includes':includes,'excludes':excludes,'packages':packages,'include_files':includefiles}},
executables = [Executable('janitor.py')]
)
Nota:
-
include_files
debe contener "sólo" las rutas relativas a la secuencia de comandossetup.py
de lo contrario la construcción fallará. -
include_files
puede ser una lista de cuerda es decir un montón de archivos con sus rutas relativas
o -
include_files
puede ser una lista de tuplas en el que la primera mitad de la tupla es el nombre del archivo con la ruta absoluta y la segunda mitad es el nombre del archivo de destino por la ruta absoluta.
(Cuando la falta de la documentación surge, consultar la Rana René)
Otros consejos
Hay un ejemplo más complejo en: cx_Freeze - wxPyWiki
La documentación que carece de todas las opciones se encuentra en: cx_Freeze (Internet Archive)
Con cx_Freeze
, sigo teniendo una salida de acumulación de 11 archivos en una sola carpeta, sin embargo, a diferencia de Py2Exe
.
Alternativas: y software | El ratón vs. Python
Con el fin de encontrar los archivos adjuntos (include_files = [-> your attached files <-]
) se debe insertar la siguiente función en el código setup.py:
def find_data_file(filename):
if getattr(sys, 'frozen', False):
# The application is frozen
datadir = os.path.dirname(sys.executable)
else:
# The application is not frozen
# Change this bit to match where you store your data files:
datadir = os.path.dirname(__file__)
return os.path.join(datadir, filename)
También puede crear secuencia de comandos independiente que copiará los archivos después de la construcción. Es lo que yo uso para reconstruir la aplicación en ventanas (que debe tener "utilidades GNU para Win32" instaladas para hacer obras "CP").
build.bat:
cd .
del build\*.* /Q
python setup.py build
cp -r icons build/exe.win32-2.7/
cp -r interfaces build/exe.win32-2.7/
cp -r licenses build/exe.win32-2.7/
cp -r locale build/exe.win32-2.7/
pause