当前位置:  开发笔记 > 编程语言 > 正文

在Python模块分发中查找文件

如何解决《在Python模块分发中查找文件》经验,为你挑选了2个好方法。

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

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

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

它有效,但看起来......是hackish.有一个更好的方法吗?我想让安装脚本从distutils模块中获取最终安装位置,并将其填入"dbconfig.py"文件,该文件与访问数据库的代码一起安装.



1> Aaron Maenpa..:

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

>>> 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获取egg页面和pkg_resources页面上的资源的更多讨论.

另请注意,在可能的情况下,建议使用pkg_resources.resource_stream或pkg_resources.resource_string,因为如果包是egg的一部分,resource_filename会将文件复制到临时目录.


@techtonik可悲的是,访问资源的两种标准方法是使用disutils或setuptools.没有合适的方法来仅使用标准库来访问模块中的资源.这部分是由于在没有外部库的情况下很难构建可广泛分发的模块.
现在这是最好的答案,因为setuptools是部分pip,而最近的Python有ensure_pip.
这使您的程序包依赖于`setuptools`,这在标准库中不存在。

2> Éric Araujo..:

使用pkgutil.get_data.它是表兄pkg_resources.resource_stream,但在标准库中,应该使用平面文件系统安装以及压缩包和其他导入程序.

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有