当python包名称与导入名称不同时

时间:2019-02-26 13:00:58

标签: python pip python-sphinx pyyaml qtpy

问题出在名称与导入过程中用法不同的python软件包中,例如:

$ pip list | grep -i "yaml\|qt"  
PyYAML      3.13               
QtPy        1.5.2
  • pyyaml(点子安装pyyaml),但导入yaml
  • qtpy(通过pip install qtpy安装),是,导入为qtpy,但程序包为QtPy

某些工具无法处理此问题,例如狮身人面像:

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

现在不记得了,但是用于扫描requirements.txt文件并显示警告的工具也是如此,该工具未安装python yaml软件包(但它的名称是pyyaml)

3 个答案:

答案 0 :(得分:1)

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

使用zip查看简单的打包命令:

zip -r MyCoolTool.zip tool.py

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

另一点是,一个pip包可能包含的模块不仅仅是一个。 PyYAML可以例如除yaml2xml之外还包含第二个python模块yaml

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

答案 1 :(得分:1)

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

  • 替代品:有时,当您可以安装货叉并使其余代码保持相同时,这会很有帮助。我猜最著名的例子是pyyaml / yaml。创建propy3时可以做到这一点,它可以直接替代propy。我会说pillow也会发生这种情况。
  • 便利性beautifulsoup4可以作为bs4导入(为bs4添加包裹寄存)
  • 丢失的凭据:我不知道导入名称也被更改的示例,但是我认为对于flask-restx,软件包名称和导入名称已被更改。< / li>

警告

Ziyad Edher has pointed out中的a related discussion一样,域名抢注是PyPI(source)上的一个问题。如果添加名称不同的软件包,则更有可能。

其他示例

文档中的名称与“导入”软件包名称与pypi package nameanaconda packagesDebian的对比:

答案 2 :(得分:0)

在使用狮身人面像的情况下,您可以使用autodoc_mock_imports

模拟第三方包装