对于使用“setup.py”构建安装包的开发人员而言,这应该是一个非常常见的问题,之前应该先询问,但我无法在任何地方找到正确答案。
在setup.py中
from distutils.core import setup
setup(
....,
....,
data_files=[('MyApp/CBV', ['myapp/data/CBV/training.cbv', 'myapp/data/CBV/test.cbv'])],
....,
....,
)
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
从使用上述结果的观察中,“/ usr / local”是“data_files”根目录。除了硬编码,是否有任何Python函数可以给我这个“data_files”根目录?
答案 0 :(得分:8)
默认情况下,以root用户身份安装软件包时,data_files
列表中的 relative 目录名称将根据sys.prefix
的值进行解析(对于纯python库) )或sys.exec_prefix
(对于具有已编译扩展名的库),因此您可以根据该文件检索文件。从distutils
documentation开始:
如果目录是相对路径,则相对于安装前缀(纯Python包的Python
sys.prefix
,包含扩展模块的包的sys.exec_prefix
)进行解释
因此,对于您的示例,您将在os.path.join(sys.prefix, 'MyApp', 'CBV')
中找到您的文件。
但是,您最好使用setuptools
扩展distutils
并使用pkg_resources
module Resource API加载数据文件。出于此目的,它附带setuptools
。您确实希望包中包含的数据文件最佳。这意味着您不使用data_files
,而是设置include_package_files=True
或列出package_files
的文件模式,请参阅setuptools文档中的Including data files。< / p>
然后,您可以直接从包中将这些资源文件加载到包含resource_string()
的字符串中,例如:
from pkg_resources import resource_string
foo_config = resource_string(__name__, 'foo.conf')