¿Alguna función de python para obtener el directorio raíz de “data_files”?

Esta debería ser una pregunta muy común para los desarrolladores que usaron “setup.py” para crear paquetes de instalación y debería preguntarse antes, pero no pude encontrar la respuesta adecuada en ningún lugar.

En setup.py

from distutils.core import setup setup( ...., ...., data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])], ...., ...., ) 

Resultado de sudo python setup.py install

 running install running build running build_py running build_scripts running install_lib running install_scripts changing mode of /usr/local/bin/MyApp_trainer to 755 changing mode of /usr/local/bin/MyApp_reference_updater to 755 changing mode of /usr/local/bin/MyApp_predictor to 755 changing mode of /usr/local/bin/reference_updater to 755 running install_data creating /usr/local/MyApp/CBV copying MyApp/data/CBV/training.cbv -> /usr/local/MyApp/CBV copying MyApp/data/CBV/test.cbv -> /usr/local/MyApp/CBV running install_egg_info Removing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info Writing /usr/local/lib/python2.7/dist-packages/MyApp-0.1.0.egg-info 

A partir de la observación que usa el resultado anterior, “/ usr / local” es el directorio raíz de “archivos de datos”. Aparte de la encoding, ¿hay alguna función de Python que pueda proporcionarme este directorio raíz de “archivos de datos”?

De manera predeterminada, al instalar un paquete como raíz, los nombres de directorio relativos en la lista de data_files se resuelven con el valor de sys.prefix (para bibliotecas de python puro) o sys.exec_prefix (para bibliotecas con una extensión comstackda), por lo que Puede recuperar sus archivos basados ​​en eso. Qouting de la documentación de distutils :

Si el directorio es una ruta relativa, se interpreta en relación con el prefijo de instalación ( sys.prefix de Python para paquetes de puro Python, sys.exec_prefix para paquetes que contienen módulos de extensión).

Entonces, para su ejemplo, encontrará sus archivos en os.path.join(sys.prefix, 'MyApp', 'CBV') .

Sin embargo, sería mejor utilizar la extensión setuptools para los distutils y utilizar la API de recursos del módulo pkg_resources para cargar archivos de datos. Viene con setuptools para este propósito. Desea que sus archivos de datos se incluyan en el paquete para que funcione mejor. Eso significa que no usaría data_files sino que, en su lugar, establezca include_package_files=True o liste los patrones de archivo con package_files , consulte Incluir archivos de datos en la documentación de setuptools.

Luego puede cargar dichos archivos de recursos directamente desde el paquete en una cadena con resource_string() por ejemplo:

 from pkg_resources import resource_string foo_config = resource_string(__name__, 'foo.conf')