选项 1:作为包数据安装
将数据文件放置在 Python 包的根目录中的主要优点
是它可以让您不必担心文件将存放在用户的何处
系统,可能是 Windows、Mac、Linux、某些移动平台或 Egg 内。你可以
总能找到目录data
相对于你的 Python 包根目录,无论它安装在哪里或如何安装。
例如,如果我有一个像这样的项目布局:
project/
foo/
__init__.py
data/
resource1/
foo.txt
您可以添加一个功能__init__.py
定位数据的绝对路径
文件:
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
项目安装为 Egg 后路径为data
会改变,但代码不需要改变:
/Users/pat/virtenv/foo/lib/python2.6/site-packages/foo-0.0.0-py2.6.egg/foo/data/resource1/foo.txt
选项 2:安装到固定位置
另一种方法是将数据放在 Python 包之外,然后
任何一个:
- 有位置
data
通过配置文件传入,
命令行参数或
- 将位置嵌入到您的 Python 代码中。
如果您计划分发您的项目,那么这是不太理想的。如果你really想要执行此操作,您可以安装data
通过传入元组列表指定每组文件的目标位置,在目标系统上的任何位置:
from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)
Updated:递归 grep Python 文件的 shell 函数示例:
atlas% function grep_py { find . -name '*.py' -exec grep -Hn $* {} \; }
atlas% grep_py ": \["
./setup.py:9: package_data={'foo': ['data/resource1/foo.txt']}