【问题标题】:Using setuptools to copy non .py files使用 setuptools 复制非 .py 文件
【发布时间】:2019-03-01 13:44:40
【问题描述】:

我的 python 项目通过setup.py 安装。项目结构如下:

├── Makefile
├── README.rst
├── circle.yml
├── docs
│   ├── Makefile
│   ├── conf.py
│   ├── deps.txt
│   ├── guide_installation.rst
│   ├── guide_model.rst
│   ├── guide_transliteration.rst
│   ├── index.rst
│   ├── make.bat
│   └── module_trans.rst
├── indictrans
│   ├── __init__.py
│   ├── _decode
│   ├── _utils
│   ├── base.py
│   ├── iso_code_transformer.py
│   ├── libindic_
│   ├── mappings
│   ├── models
│   ├── polyglot_tokenizer
│   ├── script_transliterate.py
│   ├── test.py
│   ├── tests
│   ├── transliterator.py
│   ├── trunk
│   └── unicode_marks.py
├── requirements.txt
├── setup.cfg
├── setup.py
├── test-requirements.txt
└── tox.ini

子文件夹indictrans/models 的样子

├── ben-eng
│   ├── classes.npy
│   ├── coef.npy
│   ├── intercept_final.npy
│   ├── intercept_init.npy
│   ├── intercept_trans.npy
│   └── sparse.vec
├── ben-guj
│   ├── classes.npy
│   ├── coef.npy
│   ├── intercept_final.npy
│   ├── intercept_init.npy
│   ├── intercept_trans.npy
│   └── sparse.vec

所以我有 .npy.vec 文件要包含在项目中。 在我的setup.py 中,我试图通过include_package_data 指令明确包含此文件夹models,例如:

setup(
    setup_requires=['pbr'],
    pbr=True,
    packages=find_packages(),
    include_package_data=True,
    package_data={'models': ['*.npy','*.vec']},
    ext_modules=cythonize(extensions)
)

setup.cfg我有

[files]
packages = 
    indictrans

但运行python setup.py install 不会将模型文件夹复制到安装文件夹/usr/local/lib/python2.7/dist-packages/indictrans/

如果我打印它是 find_packages 我得到的输出

['indictrans', 'indictrans.tests', 'indictrans.libindic_', 'indictrans._utils', 'indictrans._decode', 'indictrans.polyglot_tokenizer', 'indictrans.models', 'indictrans.trunk', 'indictrans.libindic_.utils', 'indictrans.libindic_.soundex', 'indictrans.libindic_.utils.tests', 'indictrans.libindic_.soundex.utils', 'indictrans.libindic_.soundex.tests', 'indictrans.libindic_.soundex.utils.tests', 'indictrans.polyglot_tokenizer.tests', 'indictrans.trunk.tests']

所以我假设indictrans/models 会被包括在内,但事实并非如此。

【问题讨论】:

    标签: python setuptools setup.py


    【解决方案1】:
    1. include_package_data=True 添加到您的setup 函数中(您已经这样做了)。
    2. 在与setup.py相同的目录下创建一个文件MANIFEST.in

    MANIFEST.in 可以如下所示:

    include indictrans/models/ben-eng/*
    include indictrans/models/ben-guj/*
    

    您不需要 setup.cfg 来执行此操作。

    来源:This great writeup of python packaging

    编辑recursive-include: 根据the documentation,这也应该有效:

    recursive-include indictrans/models *.npy *.vec
    

    【讨论】:

    • 谢谢。它会递归地工作,所以这样做 include indictrans/models/* 或者 include indictrans/models/*/**?
    • 谢谢它使用递归复制和MANIFEST.in
    【解决方案2】:

    include_package_data=True 需要MANIFEST.in

    要包含模块indictrans.models 的数据,您必须提供全名:

    package_data={'indictrans.models': ['*.npy','*.vec']},
    

    【讨论】:

    • 使用package_data 将需要include_package_data + MANIFEST.in?
    • 不,它们是include data 的两种独立方式。
    猜你喜欢
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    • 2020-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多