【问题标题】:Determine installation scheme/prefix from python package code从python包代码确定安装方案/前缀
【发布时间】:2015-02-20 13:35:15
【问题描述】:

说,我有 python 包 setup.py 有以下几行:

...
packages=['mypkg'],
data_files=[
    ('lib/mypkg/', [...]),
    ('share/mypkg/', [...]),
]
...

我假设将在$(prefix)/lib/mypkg 安装几个可执行帮助程序,并将与包相关的数据文件安装在$(prefix)/share/mypkg。关键是$(prefix) 在不同的发行版之间可能会有所不同。例如,我在 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

有没有更好的方法?

【问题讨论】:

    标签: python packages setuptools prefix


    【解决方案1】:

    我整理的方法如下代码:

    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_scheme 更改为您可以在需要的地方访问的变量(在我的情况下,是对象上的实例变量,一切都可以访问),并像这样使用它:

    data_path = sysconfig.get_path( 'data', self.install_scheme )
    

    如果 self.install_schemeNone,我只是使用不带方案名称的 sysconfig.get_path()(为我的平台提供默认方案)并希望最好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-04
      • 2019-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多