从python egg访问文件

嗨,我正在使用python包装.我有3个非代码文件,即[‘synonyms.csv’,’acronyms.csv’,’words.txt’].

>这些文件存在于文件夹结构Wordproject / WordProject / Repository / DataBank /
>我在路径Wordproject / WordProject / Repository /上有一个RepositoryReader类
>我编写了一个代码,用于提取RepositoryReader的当前位置,然后查找名为DataBank的子目录,并在那里查找3个文件.

问题是当我从代码中创建一个鸡蛋,然后运行它,

我的代码给了我错误:

Could not find the file at X:\1. Projects\Python\Wordproject\venv\lib\site-packages\Wordproject-1.0-py3.6.egg\Wordproject\Repository\DataBank\synonyms.csv

如果路径是鸡蛋,它无法获取文件或从路径读取文件.它有什么办法吗?这些文件必须在鸡蛋中.

解决方法:

您可以尝试在此处执行两项不同的操作:

>将数据文件视为包的一部分,如Python模块,并在运行时访问它们,就像您的包是普通的目录树一样,即使它不是.
>将数据文件安装在pip安装时的其他位置,安装到您可以正常访问的位置.

两者都在the section on data files的PyPA / setuptools文档中进行了解释.我想你想要第一个,这在Accessing Data Files at Runtime的小节中有所涉及:

Typically, existing programs manipulate a package’s __file__ attribute in order to find the location of data files. However, this manipulation isn’t compatible with PEP 302-based import hooks, including importing from zip files and Python Eggs. It is strongly recommended that, if you are using data files, you should use the 07002 of pkg_resources to access them. The pkg_resources module is distributed as part of setuptools, so if you’re using setuptools to distribute your package, there is no reason not to use its resource management API. See also 07003 for a quick example of converting code that uses __file__ to use pkg_resources instead.

按照这个链接,你会发现看起来像一些狡猾的老PEAK文档,但这只是因为他们真的是狡猾的旧PEAK文档.有一个version buried inside the setuptools docs,一旦你找到它,你会发现它更容易阅读和导航.

正如它所说,你可以尝试使用get_data(它将在egg / zip中工作),然后回退到访问文件(从源代码运行时可以工作),但你最好使用pkg_resources中的包装器.基本上,如果你的代码是这样做的:

path = os.path.join(__file__, 'Wordproject/WordProject/Repository/DataBank/', datathingy)
with open(path) as f:
    for line in f:
        do_stuff(line)

…你会改变它:

path = 'Wordproject/WordProject/Repository/DataBank/' + datathingy
f = pkg_resources.resource_stream(__name__, path)
for line in f:
    do_stuff(line.decode())

请注意,resource_stream文件始终以二进制模式打开.因此,如果您想将它们作为文本读取,则需要围绕它们包装TextIOWrapper,或者解码每一行.

上一篇:如何分发将可执行文件添加到路径的Python包?


下一篇:redis数据结构-intset