2010-06-03 9 views
13

Estoy trabajando en el empaquetado de un pequeño proyecto de Python como un archivo zip o egg para que pueda ser distribuido. Me he encontrado con 2 formas de incluir los archivos de configuración del proyecto, los cuales parecen producir resultados idénticos.2 técnicas para incluir archivos en una distribución de Python: ¿cuál es mejor?

Método 1:

Incluir este código en setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'], 
     data_files = [('config', ['config\propFiles1.ini', 
           'config\propFiles2.ini', 
           'config\propFiles3.ini'])] 
    ) 

Método 2:

Incluir este código en setup.py:

from distutils.core import setup 

setup(name='ProjectName', 
     version='1.0', 
     packages=['somePackage'] 
    ) 

Luego, cree un archivo MANIFEST.in con esta línea:

include config\* 

¿Hay alguna diferencia entre los métodos? ¿Cuál es el preferido? Tiendo a inclinarme hacia el primero porque entonces no es necesario ningún archivo MANIFEST.in. Sin embargo, en el primer método debe especificar cada archivo individualmente, mientras que en el segundo solo puede incluir toda la carpeta. ¿Hay algo más que deba tener en cuenta? ¿Cuál es la práctica estándar?

+0

Nota: use os.path.join para crear las rutas; usar "\" es específico de Windows. –

+9

También puede usar '/' en todas las plataformas. ¡Observe si tiene un archivo como 'config \ notes.txt' que' \ n' se convertirá en una nueva línea! Tienes suerte, '\ p' no significa nada. –

+0

@Ian Bicking - gracias por la sugerencia! Prefijé todos ellos con una r para que se ocupara de eso – froadie

Respuesta

25

MANIFEST.in controla qué archivos se colocan en el archivo zip de distribución cuando se llama al python setup.py sdist. Hace no controla lo que está instalado. data_files (o mejor package_data) controla qué archivos están instalados (y creo que también se asegura de que los archivos estén incluidos en el archivo zip). Use MANIFEST.in para los archivos que no va a instalar, como la documentación, y package_data para los archivos que usa y que no son códigos Python (como una imagen o plantilla).

+5

Tenga en cuenta que los archivos enumerados en data_files o package_data no se incluyen automáticamente en el sdist en ninguna versión Python antes de la próxima versión 2.7 (este es un error distutils que se corrigió en el último ciclo de lanzamiento). Entonces, en realidad, para las versiones de Python actualmente lanzadas, si necesita que se instalen archivos, debe listarlos AMBOS en data_files/package_data Y en MANIFEST.in. –

+1

Noté que [los 3.2 documentos] (http://docs.python.org/py3k/distutils/setupscript.html#distutils-additional-files) dicen "Modificado en 3.1: los archivos que coinciden con package_data (o data_files) se ponen automáticamente en MANIFEST, si no se proporciona una plantilla ". Sin embargo, esto no es cierto para mí, en 3.2 en WinXP: tengo que ponerlos allí manualmente creando un MANIFEST.in y agregándolos. –

+1

Eso es extraño. ¿Podrías abrir un informe de error? –

Cuestiones relacionadas