Option 1: Set as package data
The main advantage of placing data files at the root of your Python package is that it allows you not to worry about where the files will live on systems, which can be Windows, Mac, Linux, some mobile platform or inside Eggs. You can always find the data directory relative to your Python package root, no matter where or how it is installed.
For example, if I have a project layout like this:
project/ foo/ __init__.py data/ resource1/ foo.txt
You can add a function to __init__.py to find the absolute path to the file data:
import os _ROOT = os.path.abspath(os.path.dirname(__file__)) def get_data(path): return os.path.join(_ROOT, 'data', path) print get_data('resource1/foo.txt')
Outputs:
/Users/pat/project/foo/data/resource1/foo.txt
After the project is installed as an Egg, the path to data will change, but the code does not need to be changed:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
Option 2: set to a fixed location
An alternative would be to place your data outside the Python package, and then either:
- Pave the
data location through the configuration file, command line arguments, or - Paste the location into your Python code.
This is much less desirable if you plan to distribute your project. If you really want to do this, you can install data wherever you want on the target system by specifying the destination for each group of files by going to the list of tuples:
from setuptools import setup setup( ... data_files=[ ('/var/data1', ['data/foo.txt']), ('/var/data2', ['data/bar.txt']) ] )
Updated : an example shell function for a recursive grep Python file:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; } atlas% grep_py ": \[" ./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}