setup.py 中的 Python 包名称与 pip 名称

Posted

技术标签:

【中文标题】setup.py 中的 Python 包名称与 pip 名称【英文标题】:Python package name vs. pip name in setup.py 【发布时间】:2017-07-31 00:34:24 【问题描述】:

当我在 setup.py 文件的 install_requires 条目中列出依赖项时,如何指定要安装给定的包,必须将不同的名称传递给 pip 而不是包名称?

例如,我可以使用pip 安装pyinterval from PyPI,然后我可以通过from interval import interval, inf, imath 或类似方法在我的代码中使用它。有没有办法告诉 SetupTools pyinterval 实体“提供”interval 包或其他东西?

编辑:我找到了packaging glossary,它为我阐明了“分发包”和“导入包”之间的术语区别。在我的例子中,pyinterval 是分发包,它提供了interval 导入包。

【问题讨论】:

相关:***.com/questions/27308293/…。 PyPI 上的 django-emojiemoji 都提供要导入的 emoji 包,就像 PyPI 上的 pyintervalinterval 都提供要导入的 interval 包一样。 【参考方案1】:

您不需要告诉 setuptools 每个依赖项提供的“命令”是什么。您只需要按其名称安装软件包,即pyinterval。由您决定哪个包提供哪个“命令”,在这种情况下,pyinterval 包提供了实际上是一个入口点的interval“命令”(如下一段中详述)。

这个关于包注册其他包可以查询和使用的键的功能通常是通过入口点来实现的,你可以在下面的链接中阅读更多关于它的例子: http://the-hitchhikers-guide-to-packaging.readthedocs.io/en/latest/creation.html#entry-points

总结一下,告诉 setuptools 你的库需要哪些包,你可以在 GitHub 中找到很多示例:

https://github.com/search?l=Python&o=asc&p=6&q=install_requires&ref=searchresults&s=indexed&type=Code&utf8=%E2%9C%93

检查例如 Flask 的: https://github.com/pallets/flask/blob/master/setup.py

【讨论】:

我不清楚您使用的“包”是什么意思。在我的示例中,包是pyinterval,还是interval?许多来源(例如learnpython.org/en/Modules_and_Packages)似乎将它混为一谈,至少表示两种不同的东西:pypi.python.org/pypi 表示pip install package,要么是 PyPI 中的对象,要么是包含我们可以使用 import 加载的代码的目录。 我更新了答案以澄清在您的情况下,包是pyintervalintervalpyinterval 包提供的入口点。正如您提供的链接 (learnpython.org/en/Modules_and_Packages) 中所详述的那样,软件包是一个带有扭曲的目录。 pip 安装包的作用是从 PyPI(压缩目录)获取包并执行其setup.py。你可以在这里阅读更多信息:pip.pypa.io/en/latest/reference/pip_install/#overview 感谢您的澄清。也许我的部分困惑是,在 PyCharm 中,如果我的 install_requires 条目中有 pyinterval,并且我的一个代码文件有 from interval import interval,它仍然会抱怨“项目要求中没有列出包'间隔'。 "所以我以为我做错了,但也许这只是 PyCharm 中的一个错误,没有注意到它已经满足了。

以上是关于setup.py 中的 Python 包名称与 pip 名称的主要内容,如果未能解决你的问题,请参考以下文章

使用setup.py安装python包和卸载python包的方法

Python 包制作

“python setup.py install”和“pip install”之间的区别

在 CMake 中使用 setup.py 构建 python 包

Python - 在 setup.py 安装之前和之后导入包模块

如何获取当前的“包”名称? (设置.py)