从python包cod确定安装方案/前缀

2024-05-18 10:07:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个python包设置.py具有以下线条:

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

我假设几个可执行帮助程序将安装在$(prefix)/lib/mypkg,包相关的数据文件将安装在$(prefix)/share/mypkg。关键是$(prefix)可能在不同的分布中有所不同。例如,我在centos系统上默认有prefix=/usr,在debian系统上默认有prefix=/usr/local。此外,据我所知,自定义前缀甚至自定义安装方案可以作为设置.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

有更好的方法吗?你知道吗


Tags: pathpyshareprefixifoslibpackages
1条回答
网友
1楼 · 发布于 2024-05-18 10:07:51

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

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()而没有一个方案名称(给我平台的默认方案),希望是最好的。你知道吗

相关问题 更多 >