views:

205

answers:

2

I've written a Python package that includes a bsddb database of pre-computed values for one of the more time-consuming computations. For simplicity, my setup script installs the database file in the same directory as the code which accesses the database (on Unix, something like /usr/lib/python2.5/site-packages/mypackage/).

How do I store the final location of the database file so my code can access it? Right now, I'm using a hack based on the file variable in the module which accesses the database:

dbname = os.path.join(os.path.dirname(__file__), "database.dat")

It works, but it seems... hackish. Is there a better way to do this? I'd like to have the setup script just grab the final installation location from the distutils module and stuff it into a "dbconfig.py" file that gets installed alongside the code that accesses the database.

+3  A: 

That's probably the way to do it, without resorting to something more advanced like using setuptools to install the files where they belong.

Notice there's a problem with that approach, because on OSes with real a security framework (UNIXes, etc.) the user running your script might not have the rights to access the DB in the system directory where it gets installed.

dguaraglia
+3  A: 

Try using pkg_resources, which is part of setuptools (and available on all of the pythons I have access to right now):

>>> 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'

There's more discussion about using pkg_resources to get resources on the eggs page and the pkg_resources page.

Also note, where possible it's probably advisable to use pkg_resources.resource_stream or pkg_resources.resource_string because if the package is part of an egg, resource_filename will copy the file to a temporary directory.

Aaron Maenpaa