根据python包代码确定安装方案/前缀

根据python包代码确定安装方案/前缀,python,packages,setuptools,prefix,Python,Packages,Setuptools,Prefix,比如说,我有一个带有setup.py的python包,其中包含以下行: ... packages=['mypkg'], data_files=[ ('lib/mypkg/', [...]), ('share/mypkg/', [...]), ] ... 我假设将在$(前缀)/lib/mypkg安装几个可执行帮助程序,并在$(前缀)/share/mypkg安装与包相关的数据文件。关键是$(前缀)在不同的发行版之间可能会有所不同。例如,我在centos系统上默认使用prefix=/

比如说,我有一个带有setup.py的python包,其中包含以下行:

...
packages=['mypkg'],
data_files=[
    ('lib/mypkg/', [...]),
    ('share/mypkg/', [...]),
]
...
我假设将在
$(前缀)/lib/mypkg
安装几个可执行帮助程序,并在
$(前缀)/share/mypkg
安装与包相关的数据文件。关键是
$(前缀)
在不同的发行版之间可能会有所不同。例如,我在centos系统上默认使用
prefix=/usr
,在debian系统上默认使用
prefix=/usr/local
。此外,据我所知,自定义前缀甚至自定义安装方案都可以作为setup.py参数提供

因此,我希望能够使用包中的python代码严格确定包数据的安装位置。目前,我正在使用以下解决方案,但对我来说,这似乎很笨拙,而且我认为在自定义安装方案的情况下,这将是低效的:

# mypkg/__init__.py
import os
initpath = __path__[0]

while True:
    datapath, _ = os.path.split(initpath)
    if datapath == initpath:
        break
    initpath, datapath = datapath, os.path.join(datapath, 'share', 'mypkg')
    if os.path.exists(datapath):
        print datapath

有更好的方法吗?

我制定的方法是以下代码:

import sysconfig
import pkg_resources

self.install_scheme = None
distribution = pkg_resources.get_distribution( 'mypkg' )
lib_path = distribution.location
schemes = sysconfig.get_scheme_names()
for s in schemes:
    p = sysconfig.get_path( 'purelib', s )
    if p == lib_path:
        self.install_scheme = s
这适用于通过创建包元数据的
pip
安装的包。将
self.install\u scheme
更改为一个变量,您可以在需要的地方访问它(在我的例子中,对象上的一个实例变量,任何东西都可以访问),并像这样使用它:

data_path = sysconfig.get_path( 'data', self.install_scheme )
如果
self.install\u scheme
None
,我只使用了
sysconfig.get\u path()
,没有方案名称(为我的平台提供了默认方案),希望是最好的