【问题标题】:Python Packaging multiple subpackages with different data directoriesPython打包多个不同数据目录的子包
【发布时间】:2018-06-02 13:39:38
【问题描述】:

我有一个目录结构,如foobaralphabet 数据目录以及代码something.py

\mylibrary
    \packages
         \foobar
             foo.zip
             bar.zip
         \alphabet
             abc.zip
             xyz.zip
          something.py
     setup.py

目标是用户可以像这样 pip 安装模块:

pip install mylibrary[alphabet]

这将只包括来自packages/alphabet/* 数据和python 代码的数据。 pip install mylibrary[foobar] 应该有类似的行为。

如果用户在没有规范的情况下安装:

pip install mylibrary

然后它将包含packages/下的所有数据目录。

目前,我已经尝试使用 Python3.5 编写 setup.py

import glob
from setuptools import setup, find_packages


setup(
  name = 'mylibrary',
  packages = ['packages'],
  package_data={'packages':glob.glob('packages' + '/**/*.txt', recursive=True)},
)

当用户执行pip install mylibrary 时,这将创建一个包含所有数据目录的分布。

我应该如何更改 setup.py 以便可以安装像 pip install mylibrary[alphabet] 这样的特定 pip?

【问题讨论】:

  • 事情是,setup.py 永远不会知道该软件包是安装普通的还是附加的。此信息仅由安装工具(如pipeasy_install)使用,并且永远不会传递给安装脚本。你在安装脚本中定义的extras,粗略地说,只是对安装程序的附加说明:“如果你得到额外的关键字,你应该安装这个包和一束额外的包”,就是这样。

标签: python pip setuptools packaging python-packaging


【解决方案1】:

首先您必须将alphabetfoobar 打包并发布为单独的包,pip install mylibrary[alphabet] 表示

pip install mylibrary
pip install alphabet

之后添加alphabetfoobarextras

setup(
    …,
    extras = {
        'alphabet': ['alphabet'],
        'foobar': ['foobar'],
    }
)

字典中的键是pip install mylibrary[EXTRA_NAME] 中使用的名称,值是将从 PyPI 安装的包名称列表。

PS。不,你不能使用 extras 来安装一些 PyPI 中不能作为包提供的数据文件。

【讨论】:

    猜你喜欢
    • 2021-07-07
    • 1970-01-01
    • 2017-09-01
    • 2020-01-29
    • 2012-11-20
    • 1970-01-01
    • 2020-10-14
    • 2013-09-05
    • 2020-05-06
    相关资源
    最近更新 更多