获取“data_files”根目录的任何python函数?

时间:2013-01-08 09:12:30

标签: python setup.py

对于使用“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”根目录?

1 个答案:

答案 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')
相关问题