Utilizo setuptools para distribuir mi paquete de Python. Ahora necesito distribuir archivos de datos adicionales.
Por lo que he recopilado de la documentación de setuptools, necesito tener mis archivos de datos dentro del directorio del paquete. Sin embargo, preferiría tener mis archivos de datos dentro de un subdirectorio en el directorio raíz.
Lo que me gustaría evitar:
/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py
Lo que me gustaría tener en su lugar:
/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py
Simplemente no me siento cómodo con tener tantos subdirectorios, si no es esencial. No encuentro una razón por la que tengo que poner los archivos dentro del directorio del paquete. También es engorroso trabajar con tantos subdirectorios anidados en mi humilde opinión. ¿O hay alguna buena razón que justifique esta restricción?
python
setuptools
phant0m
fuente
fuente
__init__.py
archivo, incluso si ese archivo está en blanco. Por lo tanto, podría mantener un directorio de datos separado con un__init__.py
archivo vacío para que parezca un paquete. Eso debería evitar que grep de su árbol de fuentes los recoja, pero Python y sus herramientas de compilación lo reconocerán como un paquete.Respuestas:
Opción 1: instalar como datos de paquete
La principal ventaja de colocar archivos de datos dentro de la raíz de su paquete Python es que le permite evitar preocuparse por dónde vivirán los archivos en el sistema de un usuario, que puede ser Windows, Mac, Linux, alguna plataforma móvil o dentro de un huevo. Siempre puede encontrar el directorio
data
relativo a la raíz de su paquete Python, sin importar dónde o cómo esté instalado.Por ejemplo, si tengo un diseño de proyecto como este:
Puede agregar una función para
__init__.py
localizar una ruta absoluta a un archivo de datos:Salidas:
Una vez que el proyecto se instala como Egg, la ruta
data
cambiará, pero no es necesario que cambie el código:Opción 2: instalar en una ubicación fija
La alternativa sería colocar sus datos fuera del paquete de Python y luego:
data
pasada a través de un archivo de configuración, argumentos de línea de comando oEsto es mucho menos deseable si planea distribuir su proyecto. Si realmente desea hacer esto, puede instalar su
data
donde quiera en el sistema de destino especificando el destino para cada grupo de archivos pasando una lista de tuplas:Actualizado : ejemplo de una función de shell para grep recursivamente archivos Python:
fuente
data_files
. Además, podría crear un alias de shell para que grep ignore los archivos que no son de Python, algo comogrep_py
.Creo que encontré un buen compromiso que te permitirá mantener la siguiente estructura:
Debe instalar los datos como package_data, para evitar los problemas descritos en la respuesta de samplebias, pero para mantener la estructura del archivo, debe agregar a su setup.py:
De esta manera creamos la estructura apropiada "justo a tiempo" y mantenemos nuestro árbol de fuentes organizado.
Para acceder a dichos archivos de datos dentro de su código, "simplemente" usa:
data = resource_filename(Requirement.parse("main_package"), 'mypackage/data')
Todavía no me gusta tener que especificar 'mypackage' en el código, ya que los datos podrían no tener nada que ver con este módulo, pero supongo que es un buen compromiso.
fuente
Creo que básicamente puedes dar cualquier cosa como argumento * data_files * a setup () .
fuente