7

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

$ pip list | grep -i "yaml\|qt"  
PyYAML      3.13               
QtPy        1.5.2
  • pyyaml(pip 安装 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警告的工具也是如此(但它是并且它的名称是 pyyaml)。yaml

4

3 回答 3

4

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

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

zip -r MyCoolTool.zip tool.py

该工具名为tool,它可能不是唯一的,如果您不知道它的 MyCoolTool,您也不知道tool它是哪个。当我把它上传到某个地方时,我给它命名MyCoolTool,所以你现在有了一个更独特的名字,这可能更具描述性。

另一点是,一个 pip 包可能包含更多的模块,而不仅仅是一个。PyYAML例如,可以yaml2xmlyaml.

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

于 2019-02-26T13:11:40.543 回答
3

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

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

一个警告

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

其他示例

文档中的名称 vs “导入”包名称 vs pypi 包名称vs anaconda 包vs Debian

于 2020-04-27T16:09:49.620 回答
1

如果是 sphinx,您可以使用以下命令模拟 3rd 方包:autodoc_mock_imports

于 2019-02-27T09:33:35.803 回答