Python是一种整洁的编程语言,因为它的语法简单、清晰、简明。但是如果没有丰富的第三方库,Python就不会如此成功。Python在数据科学和机器学习方面非常有名,以至于它成为事实上的通用语言,就因为我们有这么多用于这些任务的库。没有这些库,Python就不会太强大。
完成本教程后,你将学会
-
- 在你的系统中,Python库安装在哪里?
- 什么是PyPI,以及一个库库如何能帮助你的项目
- 如何使用
pip命令来使用库中的库
让我们开始吧。
概述
本教程分为五个部分,它们是
- Python 生态系统
- Python库的位置
- pip命令
- 搜索软件包
- 托管你自己的资源库
Python 生态系统
在互联网之前的旧时代,语言和库是分开的。当你从教科书上学习 C 语言时,你不会看到任何东西来帮助你阅读 CSV 文件或打开 PNG 图像。在过去的Java时代也是如此。如果你需要任何不包括在官方库中的东西,你需要从不同的地方搜索它。如何下载或安装库将是特定于库的供应商的。
如果我们有一个中心库来托管许多库,让我们用一个统一的界面来安装库,并允许我们不时地检查新的版本,那就更方便了。更好的是,我们还可以用关键词在库中搜索,发现可以帮助我们项目的库。CPAN是Perl的资料库的一个例子。同样,我们有R的CRAN,RubyGems,Node.js的npm,以及Java的maven。对于Python,我们有PyPI(Python Package Index),pypi.org/。
PyPI是与平台无关的。如果你在Windows中通过从python.org下载安装程序来安装Python,你可以通过pip 命令来访问PyPI。如果你在 Mac 上使用 homebrew 来安装 Python,你也有同样的pip 命令。即使你使用Ubuntu Linux的内置Python,情况也是一样的。
作为一个资源库,你几乎可以在PyPI上找到任何东西。从Tensorflow和PyTorch这样的大型库,到minimal这样的小东西。由于PyPI上有大量的库,你可以很容易地找到实现你的项目的一些重要组成部分的工具。因此,我们有一个强大的、不断增长的Python库的生态系统,使其更加强大。
Python库的位置
当我们在Python脚本中需要一个库时,我们使用
import module_name
但 Python 如何知道在哪里读取模块的内容并为我们的脚本加载它呢?类似于Linux中的bash shell或Windows中的命令提示符寻找要执行的命令,Python依赖于一个路径列表来定位要加载的模块。在任何时候,我们都可以通过打印列表sys.path 来检查路径 (在导入sys 模块之后)。例如,在一个通过 homebrew 安装的 Python 的 Mac 中。
import sys
print(sys.path)
打印出以下内容。
['','/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python39.zip','/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9','/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload','/usr/local/lib/python3.9/site-packages']
这意味着如果你运行import my_module ,Python 将首先在与你当前位置相同的目录中寻找my_module (第一个元素,空字符串)。如果没有找到,Python 将检查位于上面第二个元素的 zip 文件内的模块。然后在作为第三个元素的目录下,以此类推。最后的路径/usr/local/lib/python3.9/site-packages 通常是你安装第三方库的地方。上面的第二、第三和第四元素是内置标准库的位置。
如果你在其他地方安装了一些额外的库,你可以设置你的环境变量PYTHONPATH ,并指向它。以Linux和Mac为例,我们可以在shell中运行如下命令。
$ PYTHONPATH="/tmp:/var/tmp" python print_path.py
其中print_path.py 是上面的两行代码。运行这个命令将打印如下。
['', '/tmp', '/var/tmp','/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python39.zip', '/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9', '/usr/local/Cellar/python@3.9/3.9.9/Frameworks/Python.framework/Versions/3.9/lib/python3.9/lib-dynload','/usr/local/lib/python3.9/site-packages']
其中我们看到Python将从/tmp ,然后是/var/tmp ,然后再检查内置库和安装的第三方库。当我们设置PYTHONPATH 环境变量时,我们用冒号 ":" 来分隔多个路径,以搜索我们的import 。如果你不熟悉shell的语法,上述定义环境变量和运行Python脚本的命令行可以分成两个命令。
$ export PYTHONPATH="/tmp:/var/tmp"
$ python print_path.py
如果你使用的是Windows,你需要这样做来代替。
C:\> set PYTHONPATH="C:\temp;D:\temp"
C:\> python print_path.py
也就是说,我们需要用分号";"来分隔路径。
**注意:**不建议这样做,但你可以在你的脚本中在import 语句之前修改sys.path 。Python 会在之后搜索import 的新位置,但这意味着将你的脚本与一个特定的路径联系起来。换句话说,你的脚本可能不会在另一台计算机上运行。
pip命令
上面打印的sys.path 中的最后一个路径是你的第三方库通常安装的地方。pip 命令是你从互联网上获取库并将其安装到该位置的方法。最简单的语法是。
pip install scikit-learn pandas
这将安装两个包,scikit-learn和pandas。之后,当新版本发布时,你可能想升级这些包。语法是。
pip install -U scikit-learn
其中-U 表示升级。要知道哪些软件包已经过时了,我们可以使用命令。
pip list --outdated
它将打印出所有在PyPI中比你的系统有更新版本的包的列表,比如下面这个。
Package Version Latest Type
---------------------------- ---------- -------- -----
absl-py 0.14.0 1.0.0 wheel
anyio 3.4.0 3.5.0 wheel
...
xgboost 1.5.1 1.5.2 wheel
yfinance 0.1.69 0.1.70 wheel
如果没有--outdated ,pip 命令将显示所有已安装的包和它们的版本。你可以选择用-V 选项来显示每个软件包的安装位置,比如下面这样。
$ pip list -v
Package Version Location Installer
---------------------------- ---------- -------------------------------------- ---------
absl-py 0.14.0 /usr/local/lib/python3.9/site-packages pip
aiohttp 3.8.1 /usr/local/lib/python3.9/site-packages pip
aiosignal 1.2.0 /usr/local/lib/python3.9/site-packages pip
anyio 3.4.0 /usr/local/lib/python3.9/site-packages pip
...
word2number 1.1 /usr/local/lib/python3.9/site-packages pip
wrapt 1.12.1 /usr/local/lib/python3.9/site-packages pip
xgboost 1.5.1 /usr/local/lib/python3.9/site-packages pip
yfinance 0.1.69 /usr/local/lib/python3.9/site-packages pip
如果你需要检查某个软件包的摘要,你可以使用pip show 命令,例如。
$ pip show pandas
Name: pandas
Version: 1.3.4
Summary: Powerful data structures for data analysis, time series, and statistics
Home-page: https://pandas.pydata.org
Author: The Pandas Development Team
Author-email: pandas-dev@python.org
License: BSD-3-Clause
Location: /usr/local/lib/python3.9/site-packages
Requires: numpy, python-dateutil, pytz
Required-by: bert-score, copulae, datasets, pandas-datareader, seaborn, statsmodels, ta, textattack, yfinance
这将给你一些信息,如主页、你安装它的地方,以及它所依赖的其他软件包和依赖它的软件包。
当你需要删除一个软件包时(例如,释放磁盘空间),你可以简单地运行
pip uninstall tensorflow
使用pip 命令的最后一个注意事项。pip有两种类型的软件包。以源代码形式分发的软件包,或以二进制形式分发的软件包。只有当部分模块不是用Python写的,而是用其他语言(例如C或Cython)写的,并且在使用前需要编译时,它们才会有所不同。源码包将在你的机器上编译,但二进制分发已经编译好了,但特定于平台(如64位Windows)。通常后者是作为 "轮子 "包发布的,你需要先安装wheel ,以享受全部好处。
pip install wheel
像Tensorflow这样的大型软件包,从头开始编译需要很多时间。因此,建议安装wheel ,并在有轮子包的时候使用。
搜索一个软件包
较新版本的pip 命令禁用了搜索功能,因为它给PyPI系统带来了太多的工作量。
我们可以在PyPI上寻找一个软件包的方法是使用其网页上的搜索框

当你输入一个关键词,比如 "gradient boosting",它就会显示许多包含该关键词的软件包。

而你可以点击每一个包,了解更多的细节(通常包括代码实例),以确定哪一个适合你的需要。
如果你喜欢用命令行,你可以安装pip-search 包。
pip install pip-search
然后你可以运行pip_search 命令,用一个关键词来搜索。
pip_search gradient boosting
它不会给你PyPI上的所有东西,因为会有成千上万的东西。但它会给你最相关的结果。下面是Mac终端的结果。
托管你自己的资源库
PyPI是互联网上的一个资源库。但pip 命令并不完全使用它。如果你有一些原因想拥有你自己的PyPI服务器(例如,在你的公司网络内部托管,这样你的pip 就不会超出你的防火墙),你可以试试pypiserver 包。
pip install pypiserver
按照该包的文档,你可以使用pypi-server 命令来设置你的服务器。然后,你可以上传软件包并开始服务。关于如何配置和设置你自己的服务器的细节将太长,无法在这里详细描述。但它所做的是以pip 命令能够理解的格式提供一个可用软件包的索引,并在pip 请求一个特定的软件包时提供该软件包的下载。
如果你有自己的服务器,你可以通过以下方式在pip 中安装一个软件包
pip install pandas --index-url https://192.168.0.234:8080
其中--index-url 后面的地址是你自己服务器的主机和端口号。
PyPI 不是唯一的仓库。如果你用Anaconda安装Python,你有一个替代系统conda 来安装软件包。语法相似(几乎都是用conda 替换pip ,就会如期工作)。然而,应该提醒你的是,它们是两个不同的系统,独立工作。
总结
在本教程中,你已经发现了pip 这个命令,以及它如何从 Python 生态系统中带来丰富的软件包来帮助你的项目。具体来说,你学到了
- 如何从PyPI中寻找一个包
- Python 如何在你的系统中管理它的库
- 如何从你的系统中安装、升级和删除一个包
- 我们如何在我们的网络中托管我们自己的PyPI版本?
