gpt4 book ai didi

python - setuptools:包数据文件夹位置

转载 作者:IT老高 更新时间:2023-10-28 21:32:05 27 4
gpt4 key购买 nike

我使用 setuptools 来分发我的 python 包。现在我需要分发额外的数据文件。

根据我从 setuptools 文档中收集到的信息,我需要将数据文件放在包目录中。但是,我宁愿将我的数据文件放在根目录的子目录中。

我想避免的:

/ #root
|- src/
| |- mypackage/
| | |- data/
| | | |- resource1
| | | |- [...]
| | |- __init__.py
| | |- [...]
|- setup.py

我想拥有什么:

/ #root
|- data/
| |- resource1
| |- [...]
|- src/
| |- mypackage/
| | |- __init__.py
| | |- [...]
|- setup.py

如果不是必需的话,我只是对拥有这么多子目录感到不自在。我找不到原因,为什么我/have/将文件放在包目录中。恕我直言,使用如此多的嵌套子目录也很麻烦。或者有什么好的理由可以证明这种限制是合理的?

最佳答案

选项 1:作为包数据安装

将数据文件放在 Python 包的根目录中的主要优点是它让您不必担心文件将保存在用户的系统,可能是 Windows、Mac、Linux、某些移动平台或 Egg 内部。你可以始终找到相对于 Python 包根目录的 data 目录,无论它安装在何处或如何安装。

例如,如果我有这样的项目布局:

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

输出:

/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 包之外,然后要么:

  1. 通过配置文件传入 data 的位置,命令行参数或
  2. 将位置嵌入到您的 Python 代码中。

如果您计划分发您的项目,这将是不可取的。如果您真的想要这样做,您可以通过传入元组列表来指定每组文件的目标,从而将 data 安装在目标系统上的任意位置:

from setuptools import setup
setup(
...
data_files=[
('/var/data1', ['data/foo.txt']),
('/var/data2', ['data/bar.txt'])
]
)

更新:递归 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']}

关于python - setuptools:包数据文件夹位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4519127/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com