在安装和使用一些库如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中设置的名字。