在安装和使用一些库如 Pillow 时,我们会发现使用 pip 工具安装的是一个名字,而使用 import 导入的时候却是另外一个名字。为寻找答案,我去翻看了这些库的目录,并查找了以下 pypi(python 包仓库)的指南。

安装包名

首先是 pip 安装时的包名,这个是由发布者在发布的包中 setup.py 文件所决定的,当其中的 name 变量名为 "Pillow" 时,这个包在 pip 安装时的名字就叫 "Pillow",以 Pillow 的 setup.py 文件为例:

NAME = 'Pillow'
PILLOW_VERSION = get_version()

setup(name=NAME,
      version=PILLOW_VERSION,
      description='Python Imaging Library (Fork)',
      long_description=_read('README.rst').decode('utf-8'),
      author='Alex Clark (Fork Author)',
      author_email='aclark@aclark.net',
      url='http://python-pillow.org',
      ...
    )

可以看到在 setup 函数中 name 变量的值为 Pillow,所以安装时为 pip install Pillow

使用包名

那为什么我们安装时包名为 Pillow,但是使用时却是 import PIL?这要从安装完后的包来看。

来到 Lib/site-packages 文件夹,我们会发现,根本就没有一个包叫做 Pillow,反而有一个包名叫做 PIL。这是因为 pip 工具在安装时执行了 setup.py,进行了一系列设置,而在 site-packages 文件夹得到的是最终成品。

到这里也就明白了,导入时的包名就是 site-packages 文件夹下的名字,与包本身的名字并没有关系,而包的名字取决于开发者提交时 setup.py 中设置的名字。