为了账号安全,请及时绑定邮箱和手机立即绑定

在Python模块发行版中查找文件

在Python模块发行版中查找文件

撒科打诨 2021-03-21 09:12:47
我已经编写了一个Python程序包,其中包含一个bsddb数据库,该数据库包含用于更耗时的计算之一的预先计算的值。为简单起见,我的安装脚本将数据库文件安装在与访问数据库的代码相同的目录中(在Unix上,类似于/usr/lib/python2.5/site-packages/mypackage/)。如何存储数据库文件的最终位置,以便我的代码可以访问它?现在,我正在使用一种基于__file__访问数据库的模块中变量的技巧:dbname = os.path.join(os.path.dirname(__ file__),“ database.dat”)它可以工作,但似乎...有点黑。有一个更好的方法吗?我想让安装脚本从distutils模块中获取最终安装位置,并将其填充到一个“ dbconfig.py”文件中,该文件与访问数据库的代码一起安装。
查看完整描述

4 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

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


>>> 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来获取鸡蛋页面和pkg_resources页面上的资源的更多讨论。


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


查看完整回答
反对 回复 2021-03-22
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

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


查看完整回答
反对 回复 2021-03-22
?
长风秋雁

TA贡献1757条经验 获得超7个赞

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

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


查看完整回答
反对 回复 2021-03-22
  • 4 回答
  • 0 关注
  • 179 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信