【发布时间】:2017-02-07 20:38:40
【问题描述】:
如果我的 Python 包中有一个脚本,我如何让它从包中读取其他文件,因为__file__ 包含(例如)/usr/bin/myscript 而不是/usr/lib/python3.3/site-packages/mypackage/myscript?
(这些文件只是模板,而不是模块。)
【问题讨论】:
如果我的 Python 包中有一个脚本,我如何让它从包中读取其他文件,因为__file__ 包含(例如)/usr/bin/myscript 而不是/usr/lib/python3.3/site-packages/mypackage/myscript?
(这些文件只是模板,而不是模块。)
【问题讨论】:
任何基于路径名的方法都不起作用,因为您的包或整个站点包可能是一个 zip 文件,或者文件可能已安装在包内以外的其他位置,等等。
pkgutil 模块,尤其是 get_data 函数,是获取作为包一部分的数据文件内容的 stdlib 方法。
请参阅Installing Package Data 和Installing Additional Files,了解有关确保文件最终确实最终存在的更多信息。
如果您想使用setuptools 而不仅仅是标准库,pkg_resources 可以让事情变得更容易/更灵活。
【讨论】:
/usr。有没有办法把它放在与包裹更相关的地方?
'share/myapp/foo' 而不是'foo'。尝试以平台友好的方式为每个平台做到这一点并不是那么有趣。如果您需要任何复杂和跨平台的东西,请使用 setuptools。
package_data。它应该在哪里安装文件?
你可以使用setuptools中的ResourceManager API'pkg_resources:
import pkg_resources
my_stream = pkg_resources.resource_stream(__name__, "foo.dat")
例如将my.package/my/package/foo.dat作为类文件对象my_stream打开。
这适用于普通鸡蛋和带拉链的鸡蛋。但是请注意,这需要安装 setuptools。对于仅使用标准库的解决方案(这是首选),请参阅@abarnert 的答案。
【讨论】: