Python 是一门不错的编程语言,因为它语法简单、清晰、简洁。但如果没有丰富的第三方库,Python 也不会如此成功。Python 因数据科学和机器学习而闻名,以至于它已成为事实上的通用语言,这仅仅是因为我们有如此多的库可用于这些任务。没有这些库,Python 并不强大。
完成本教程后,你将学到:
-
- Python 库安装在您系统中的位置
- 什么是 PyPI,以及库存储库如何帮助您的项目
- 如何使用
pip
命令从存储库中使用库
立即开始您的项目,阅读我的新书《Python for Machine Learning》,其中包含分步教程和所有示例的Python 源代码文件。
让我们开始吧。
探索 Python 生态系统
照片由 Vinit Srivastava 拍摄。保留部分权利。
概述
本教程共五部分;它们是
- Python 生态系统
- Python 库位置
- Pip 命令
- 搜索包
- 托管您自己的存储库
Python 生态系统
在互联网出现之前的旧时代,语言和库是分开的。当您从教科书中学习 C 时,您不会看到任何帮助您读取 CSV 文件或打开 PNG 图像的内容。Java 的旧时代也是如此。如果您需要官方库中未包含的任何内容,您需要从各种地方搜索它。如何下载或安装库将取决于库的供应商。
如果我们有一个中央存储库来托管许多库,并允许我们使用统一的界面安装库,从而可以随时检查新版本,那将更加方便。甚至更好的是,我们还可以通过关键字在存储库中搜索,以发现可以帮助我们项目的库。CPAN 是 Perl 库存储库的一个示例。类似地,我们有 R 的 CRAN、Ruby 的 RubyGems、Node.js 的 npm 和 Java 的 Maven。对于 Python,我们有 PyPI(Python Package Index),https://pypi.ac.cn/。
PyPI 是平台无关的。如果您通过从 python.org 下载安装程序在 Windows 上安装了 Python,您就可以使用 pip
命令访问 PyPI。如果您在 Mac 上使用 homebrew 安装 Python,您也拥有相同的 pip
命令。即使您使用 Ubuntu Linux 内置的 Python,情况也是如此。
作为一个存储库,您可以在 PyPI 上找到几乎任何东西。从 Tensorflow 和 PyTorch 等大型库到 minimal 等小型库。由于 PyPI 上有大量的库可用,您可以轻松找到实现项目某些重要组件的工具。因此,Python 拥有一个强大且不断增长的库生态系统,这使其功能更加强大。
想开始学习机器学习 Python 吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
Python 库位置
当我们在 Python 脚本中需要一个库时,我们使用
1 |
import module_name |
但是 Python 如何知道从哪里读取模块内容并将其加载到我们的脚本中呢?就像 Linux 中的 bash shell 或 Windows 中的命令提示符查找要执行的命令一样,Python 依赖于一个路径列表来定位要加载的模块。随时,我们可以通过打印列表 sys.path
(导入 sys
模块后)来检查路径。例如,在 Mac 上通过 homebrew 安装的 Python
1 2 |
import sys print(sys.path) |
它会打印出以下内容
1 2 3 4 5 |
['', '/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 中运行以下命令
1 |
$ PYTHONPATH="/tmp:/var/tmp" python print_path.py |
其中 print_path.py
是上面的两行代码。运行此命令将打印以下内容
1 2 3 4 5 |
['', '/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 脚本的命令行可以分解为两个命令
1 2 |
$ export PYTHONPATH="/tmp:/var/tmp" $ python print_path.py |
如果您使用的是 Windows,则需要执行以下操作
1 2 3 |
C:\> set PYTHONPATH="C:\temp;D:\temp" C:\> python print_path.py |
也就是说,我们需要使用分号“;
”来分隔路径。
注意:不建议这样做,但您可以在 import
语句之前在脚本中修改 sys.path
。Python 之后将在此新位置搜索 import
,但这会将您的脚本与特定路径绑定。换句话说,您的脚本可能无法在另一台计算机上运行。
Pip 命令
上面打印的 sys.path
中的最后一个路径是您的第三方库通常安装的位置。pip
命令就是您如何从 Internet 获取库并将其安装到该位置。最简单的语法是
1 |
pip install scikit-learn pandas |
这将安装两个包:scikit-learn 和 pandas。稍后,当新版本发布时,您可能需要升级这些包。语法是
1 |
pip install -U scikit-learn |
其中 -U
表示升级。要了解哪些包已过时,我们可以使用命令
1 |
pip list --outdated |
它将打印 PyPI 中比您系统新的所有包的列表,例如
1 2 3 4 5 6 7 |
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
选项显示每个包的安装位置,例如
1 2 3 4 5 6 7 8 9 10 11 12 |
$ 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
命令,例如
1 2 3 4 5 6 7 8 9 10 11 |
$ 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 |
这为您提供了一些信息,例如主页、安装位置,以及它依赖于哪些其他包以及哪些包依赖于它。
当您需要删除一个包(例如,释放磁盘空间)时,您只需运行
1 |
pip uninstall tensorflow |
关于使用 pip
命令的最后一点说明:pip
包有两种类型。一种是分发为源代码的包,另一种是分发为二进制文件的包。它们只有在模块的一部分不是用 Python 编写而是用其他语言(例如 C 或 Cython)编写并需要编译后才能使用时才有所不同。源代码包将在您的机器上编译,但二进制分发版已编译,特定于平台(例如 64 位 Windows)。通常后者以“wheel”包的形式分发,您需要先安装 wheel
才能充分享受其优势
1 2 |
pip install wheel |
像 Tensorflow 这样的大型包从头开始编译需要数小时。因此,建议安装 wheel
并在可能的情况下使用 wheel 包。
搜索包
较新版本的 pip
命令禁用了搜索功能,因为它给 PyPI 系统带来了过大的负担。
我们可以通过使用 PyPI 网页上的搜索框来查找 PyPI 上的包。
当您输入关键字,例如“gradient boosting”时,它会显示包含该关键字的许多包
您可以点击每个包以获取更多详细信息(通常包括代码示例),以确定哪个最适合您的需求。
如果您更喜欢命令行,可以安装 pip-search
包
1 |
pip install pip-search |
然后您可以使用 pip_search
命令并带上关键字进行搜索
1 |
pip_search gradient boosting |
它不会显示 PyPI 上的所有内容,因为会有成千上万个。但它会为您提供最相关的结果。下面是 Mac 终端的结果
托管您自己的存储库
PyPI 是互联网上的一个存储库。但是 pip
命令并不只使用它。如果您因为某些原因想拥有自己的 PyPI 服务器(例如,在公司网络内部托管,这样您的 pip
就不会超出您的防火墙),您可以尝试 pypiserver
包
1 |
pip install pypiserver |
根据该包的文档,您可以使用 pypi-server
命令来设置您的服务器。然后,您可以上传包并开始提供服务。关于如何配置和设置您自己的服务器的详细信息在这里会太长而无法详细描述。但它的作用是提供一个 pip
命令可以理解的格式的可用包索引,并在 pip
请求某个特定包时提供该包供下载。
如果您有自己的服务器,您可以通过以下方式在 pip
中安装一个包
1 |
pip install pandas --index-url https://192.168.0.234:8080 |
在这里,--index-url
之后的地址是您自己服务器的主机和端口号。
PyPI 并非唯一的存储库。如果您使用 Anaconda 安装了 Python,您将拥有一个替代系统 conda
来安装包。语法类似(几乎总是将 pip
替换为 conda
都会按预期工作)。但是,您应该记住,它们是两个独立运行的系统。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- pip 文档,https://pip.pypa.org.cn/en/stable/
- Python 包索引,https://pypi.ac.cn/
- pypiserver 包,https://pypi.ac.cn/project/pypiserver/
总结
在本教程中,您了解了 pip
命令以及它如何为您的项目带来 Python 生态系统中丰富的包。具体来说,您学习了
- 如何从 PyPI 查找包
- Python 如何管理系统中的库
- 如何从系统中安装、升级和删除包
- 我们如何在网络中托管自己的 PyPI 版本
暂无评论。