探索 Python 的生态系统

212 阅读7分钟

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

如果没有--outdatedpip 命令将显示所有已安装的包和它们的版本。你可以选择用-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版本?