簡體   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