Hi I am working with python packaging. I have 3
non-code files namely
['synonyms.csv', 'acronyms.csv', 'words.txt'].
RepositoryReader class at the path
RepositoryReader and then looks for a
DataBank and looks for the 3 files there.
The problem is when I create an
egg out of the code, and then run it,
My code gives me the error:
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
It's not able to fetch the file or read it from the path if the path is of an egg. Is there any way around it? These files have to be in an
There are two different things you could be trying to do here:
pip install time, to a location you can access normally.
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 ResourceManager API of
pkg_resourcesto access them. The
pkg_resourcesmodule is distributed as part of
setuptools, so if you’re using
setuptoolsto distribute your package, there is no reason not to use its resource management API. See also Accessing Package Resources for a quick example of converting code that uses
Follow that link, and you find what look like some crufty old PEAK docs, but that's only because they really are crufty old PEAK docs. There is a version buried inside the
setuptools docs that you may find easier to read and navigate once you manage to find it.
As it says, you could
get_data (which will work inside an egg/zip) and then fall back to accessing a file (which will work when running from source), but you're better off using the wrappers in
pkg_resources. Basically, if your code was doing this:
path = os.path.join(__file__, 'Wordproject/WordProject/Repository/DataBank/', datathingy)
with open(path) as f:
for line in f:
… you'll change it to this:
path = 'Wordproject/WordProject/Repository/DataBank/' + datathingy
f = pkg_resources.resource_stream(__name__, path)
for line in f:
resource_stream files are always opened in binary mode. So if you want to read them as text, you need to wrap a
TextIOWrapper around them, or decode each line.