为PIP制作一个包含data_files的python包

5 投票
3 回答
9512 浏览
提问于 2025-04-17 05:12

我正在做一个项目,布局是这样的:

project/
    bin/
        my_bin.py
    CHANGES.txt
    docs/
    LICENSE.txt
    README.txt
    MANIFEST.in
    setup.py
    project/
        __init__.py
        some_thing.py
        default_data.json
        other_datas/
            default/
                other_default_datas.json

问题是,当我用pip安装这个项目时,"default_data.json"文件和"other_datas"文件夹并没有和其他应用程序的文件放在同一个地方。

我该怎么做才能让它们放在同一个地方呢?

它们最后放在了"/home/user/.virtualenvs/proj-env/project"这个位置,

而不是放在"/home/user/.virtualenvs/proj-env/lib/python2.6/site-packages/project"这个位置。

在setup.py文件中,我是这样做的:

inside_dir = 'project'
data_folder= os.path.join(inside_dir,'other_datas')

data_files = [(inside_dir, [os.path.join(inside_dir,'default_data.json')])]
for dirpath, dirnames, filenames in os.walk(data_folder):
    data_files.append([dirpath, [os.path.join(dirpath, f) for f in filenames]])

3 个回答

-1

把你的 MANIFEST.in 文件改一下,把那些 .json 文件加进去。

这样做可能就能解决问题:

recursive-include project/ *.json
0

看看这个包 https://pypi.python.org/pypi/datafolder。它可以让你更简单地安装和使用数据文件,比如 *.conf、*.ini、*.db 等等,既可以通过你的包来使用,也可以通过用户来使用。

7

来自 https://docs.python.org/3.4/distutils/setupscript.html#installing-additional-files 的内容:

如果 directory 是一个相对路径,那它会根据安装的前缀来解释(对于纯Python包来说是Python的 sys.prefix,而对于包含扩展模块的包则是 sys.exec_prefix)。

files 中的每个文件名都是相对于包源代码分发中的 setup.py 脚本来解释的。

所以,这里描述的行为就是 data_files 的工作方式。

如果你想在你的包中包含数据文件,你需要使用 package_data 来代替:

package_data={'project': ['default_data.json', 'other_datas/default/*.json']}

撰写回答