繁体   English   中英

为什么某些 Python 包名称与其导入名称不同?

[英]Why are some Python package names different than their import name?

一些包是使用与 PyPI 上包的名称不同的字符串导入的,例如:

$ pip list | grep -i "yaml\|qt"  
PyYAML      3.13               
QtPy        1.5.2
  • pyyaml (pip install pyyaml),但导入 yaml
  • qtpy (pip install qtpy),是的,导入是 qtpy 但包是 QtPy

一些工具无法处理,例如 sphinx:

$ make html
WARNING: autodoc: failed to import module 'wireshark' from module 'logcollector.plugins'; the following exception was raised:
No module named 'qtpy'

我现在不记得了,但同样适用于扫描requirements.txt文件并打印未安装yaml包的警告(但它是,它的名称是 pyyaml)。

因为这两个概念并没有真正的关联。
一个是包/模块名称的python概念,另一个是包管理器概念。

看一个带 zip 的简单打包命令:

zip -r MyCoolTool.zip tool.py

该工具名为tool ,这可能不是唯一的,如果您不知道它的 MyCoolTool,您就不会知道它是哪个tool 当我将它上传到某个地方时,我将其命名为MyCoolTool ,因此您现在使用了一个更独特的名称,这可能更具描述性。

另一点是,一个 pip 包可能包含更多的模块,而不仅仅是一个。 例如, PyYAML可以在yaml包含第二个 python 模块yaml2xml

最后可以有多种实现方式。 PyYAML听起来像一个纯 python 实现。 现在假设您需要一个非常快速的解析器,然后您可以使用 C 后端编程CYAML ,但名称为yaml接口相同。

在 sphinx 的情况下,您可以使用以下命令模拟 3rd 方包: autodoc_mock_imports

作者在不同环境中选择使用不同名称的原因有多种:

  • 直接替换:有时当您可以安装一个 fork 并保持其余代码相同时会很有帮助。 我想最著名的例子是pyyaml / yaml。 我做到了,当我创建propy3它可以作为一个下拉更换为propy 我想说这也是pillow发生的事情。
  • 方便beautifulsoup4可以导入作为bs4 (+为包停车bs4
  • 丢失凭据:我不知道导入名称也更改的示例,但我认为对于flask-restx ,包名称和导入名称已更改。

一句小心的话

正如Ziyad Edher相关讨论中指出的那样,域名抢注是 PyPI 上的一个问题( 来源)。 如果您添加具有不同名称的包,则更有可能出现这种情况。

其他例子

文档中的名称 vs "import" 包名 vs pypi 包名vs anaconda 包vs Debian

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM