关于distutils:在Python模块发行版中查找文件

关于distutils:在Python模块发行版中查找文件

Finding a file in a Python module distribution

本问题已经有最佳答案,请猛点这里访问。

我已经编写了一个Python程序包,其中包含一个bsddb数据库,该数据库包含用于更耗时的计算之一的预先计算的值。 为简单起见,我的安装脚本将数据库文件安装在与访问数据库的代码相同的目录中(在Unix上,类似于/usr/lib/python2.5/site-packages/mypackage/)。

如何存储数据库文件的最终位置,以便我的代码可以访问它? 现在,我正在使用基于访问数据库的模块中__file__变量的黑客:

1
dbname = os.path.join(os.path.dirname(__file__),"database.dat")

它可以工作,但似乎...有点黑。 有一个更好的方法吗? 我想让安装脚本从distutils模块中获取最终安装位置,并将其填充到一个" dbconfig.py"文件中,该文件与访问数据库的代码一起安装。


尝试使用pkg_resources,它是setuptools的一部分(并且在我现在可以访问的所有python上都可用):

1
2
3
4
5
>>> import pkg_resources
>>> pkg_resources.resource_filename(__name__,"foo.config")
'foo.config'
>>> pkg_resources.resource_filename('tempfile',"foo.config")
'/usr/lib/python2.4/foo.config'

关于使用pkg_resources来获取更多信息的讨论在eggs页面和pkg_resources页面上。

还要注意,在可能的情况下,建议使用pkg_resources.resource_stream或pkg_resources.resource_string,因为如果包是鸡蛋的一部分,则resource_filename会将文件复制到一个临时目录中。


使用pkgutil.get_data。它是pkg_resources.resource_stream的表亲,但在标准库中,并且应与平面文件系统安装以及压缩包和其他导入程序一起使用。


这可能是这样做的方法,而无需诉诸更高级的功能,例如使用setuptools将文件安装在它们所属的位置。

请注意,这种方法存在问题,因为在具有真正安全框架(例如UNIX等)的OS上,运行脚本的用户可能无权访问安装了DB的系统目录中的DB。


使用标准的Python-3.7库的importlib.resources模块,
setuptools:pkg_resources更有效
(在以前的Python版本中,使用向后移植的importlib_resources库)。

注意:为使此工作正常,数据文件所在的文件夹必须是常规的python-package。这意味着您必须在其中添加__init__.py文件(如果尚未存在)。

然后您可以像这样访问它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
try:
  import importlib.resources as importlib_resources
except ImportError:
  # In PY<3.7 fall-back to backported `importlib_resources`.
  import importlib_resources


## Note that the actual package could have been used,
#  not just its (string) name, with something like:
#      from XXX import YYY as data_pkg
data_pkg = '.'
fname = 'database.dat'

db_bytes = importlib_resources.read_binary(data_pkg, fname)
# or if a file-like stream is needed:
with importlib_resources.open_binary(data_pkg, fname) as db_file:
    ...


推荐阅读

    计算机主板BIOS设置详细-BIOS知识

    计算机主板BIOS设置详细-BIOS知识,,什么是电脑BIOS,一般电脑主板已经设置完毕后,电脑就开始按del键进入BIOS。系统启动BIOS,即微机的基本输入

    计算机蓝屏故障的计算机蓝屏解决方案

    计算机蓝屏故障的计算机蓝屏解决方案,,电脑蓝屏电脑故障经常使用电脑的朋友经常遇到,因为电脑蓝屏是一个非常普遍的现象,所以很难预测,什么时

    计算机自动关机的原因是什么

    计算机自动关机的原因是什么,,计算机(计算机),通常称为计算机,是一种用于高速计算的电子计算机。它可以进行数值计算和逻辑计算,还具有存储记忆

    电脑功率计算|电脑功率计算公式

    电脑功率计算|电脑功率计算公式,,电脑功率计算公式  从设计角度出发一般取300w/台基本都可以满足要求,可以从以下几个方面分析一下电脑功

    如何设置计算机视图视图的统一视图

    如何设置计算机视图视图的统一视图,,不知道你是否有这样的使用电脑经验,电脑在不同的文件夹打开,有时这个文件夹是用来查看列表的方式,但是当

    的故障_计算机解决无法打印文档

    的故障_计算机解决无法打印文档,,核心提示:最近,打印机出现了一个奇怪的现象,在打印正常之前,打印机不能打印最近的突然,提示发送打印作业,计算

    PC计算机:AMDCPU核心细节

    PC计算机:AMDCPU核心细节,,核心提示:AthlonXP的核心型athlonxp有4种不同的核心类型,但都有个共同点:他们都使用socketa接口,他们都使用PR标称值

    分析计算机减速的原因

    分析计算机减速的原因,,核心提示:做以上九点,我相信你的爱是快的。当然,如果速度很慢,你应该考虑硬件升级。学习电脑组装,就来吧… 有很多人说