位于包内部的python打开配置文件

位于包内部的python打开配置文件,python,config,setuptools,Python,Config,Setuptools,我正在尝试分发一个包含非python文件的python包。该文件位于mypackge/config.yml中,我还在manifest.in(递归包含mypackage*.yml)中添加了它。当我运行python setup.py安装时,它显然被添加到了egg中,但我不知道如何访问代码中的文件open(os.path.join('mypackage','config.yml'))将在我从setup.py所在的目录中cd出来后立即停止工作 有没有一种方法可以像Java的getResourceAsSt

我正在尝试分发一个包含非python文件的python包。该文件位于mypackge/config.yml中,我还在manifest.in(递归包含mypackage*.yml)中添加了它。当我运行python setup.py安装时,它显然被添加到了egg中,但我不知道如何访问代码中的文件
open(os.path.join('mypackage','config.yml'))
将在我从setup.py所在的目录中cd出来后立即停止工作


有没有一种方法可以像Java的
getResourceAsStream
方法那样安全地访问egg中的文件?

是的,您正在寻找的是现在与
setuptools
捆绑在一起的方法,因此是普遍使用的。具体而言:

import pkg_resources
my_data = pkg_resources.resource_string(__name__, "config.yml")

请注意,这将返回字节。您甚至可以通过替换
\uuuu name\uuuu

从其他软件包中获取资源。我还可以获取文本流吗(我不想对其进行编码,因为这意味着我必须读取整个文件并将其解码保存到StringIO中)?您可以使用
resource\u stream
而不是
resource\u string
——为您提供类似文件的对象,并且也将处于二进制(字节)模式。很抱歉,这不清楚。我已经发现了流,但是,我需要一个文本模式的类似文件的对象。我不想为了将整个文件转换成文本模式的文件而将其加载到内存中。(在调用readline时,我也无法对其进行解码,因为我只是给了文件另一个方法a)<代码>io.TextIOWrapper就是这样做的。