Python 哲学的一个方面在整个语言可读性或 Pythonic 代码中始终是最重要的。本书将帮助您掌握 Python 的编写方法:可读、美观、明确,并且尽可能简单。简而言之,它将是 python 代码。这并不是说不涉及复杂的主题。当然,他们会这样做,但是每当 Python 的哲学受到威胁时,您都会收到警告,指出何时何地该技术是合理的。
本书中的大部分代码将在 Python2 和 Python3 上运行,但主要目标是 Python3。这样做有三个原因:
- Python3 于 2008 年发布,在快速变化的软件世界中这是一段很长的时间。它不再是新事物,它是稳定的,它是可用的,最重要的是,它是未来。
- Python 2 的开发实际上在 2009 年停止了。某些特性已经从 Python3 向后移植到 Python2,但任何新的开发都将首先针对 Python3。
- Python3 已经成熟了。虽然我必须承认,Python 3.2 和旧版本仍然有一些小问题,使得很难编写在 Python 2 和 Python 上都起作用的代码,Python 3.3 在这方面确实有很大改进,并且我认为它是成熟的。这可以从 Python 3.4 和 3.5 中稍加修改的语法以及本书介绍的许多非常有用的特性中得到证明。
总之,Python3 是对 Python2 的改进。很长一段时间以来,我本人一直持怀疑态度,但我不认为有任何理由不在新项目中使用 Python 3,即使将现有项目移植到 Python 3 上,通常也只需要做一些小的更改。有了很酷的新特性,比如 Python 3.5 中的async with,您只需要升级就可以尝试一下。
第一章将向您展示如何正确设置环境,创建新的隔离环境,并确保在不同的机器上运行相同的代码时获得相似的结果。大多数 Python 程序员已经在使用virtualenv来创建虚拟 Python 环境,但是在 Python 3.3 中引入的venv命令是一个非常好的替代方法。它本质上是virtualenv包的克隆,但稍微简单一些,并与 Python 捆绑在一起。虽然它的用法大部分类似于virtualenv,但有一些变化值得了解。
其次,我们将讨论的pip命令。当通过 Python 3.4 中引入的ensurepip包使用venv时,pip命令会自动安装。这个包自动将pip引导到现有的 Python 库中,同时维护 Python 和pip的独立版本。在 Python 3.4 之前,venv没有pip,必须手动安装。
最后,我们将讨论如何安装使用distutils创建的包。虽然纯 Python 软件包通常很容易安装,但当涉及到 C 模块时,它会变得很有挑战性。
本章涵盖以下主题:
- 使用
venv创建虚拟 Python 环境 - 使用
ensurepip引导 pip - 基于
distutils(C/C++)和pip安装软件包
大多数 Python 程序员已经熟悉了venv或virtualenv,但即使你不熟悉,开始使用它也不会太晚。venv模块旨在隔离 Python 环境,以便您可以安装特定于当前项目的包,而不会污染全局命名空间。例如,如果您希望在当前目录中使用标准 Pythonsys库,那么在当前目录中使用sys.py等文件名可能会严重破坏您的代码。您的本地 sys 库将先于全局 sys 库导入,从而有效地隐藏系统库。此外,由于软件包是在本地安装的,因此安装它们不需要系统(root/管理员)访问权限。
结果是,您可以确保本地开发机器和生产机器上的包的版本完全相同,而不会干扰其他包。例如,有许多 Django 包需要 Django 项目的特定版本。使用venv,您可以轻松地为项目 A 安装 Django 1.4,为项目 B 安装 Django 1.8,而无需他们知道在其他环境中安装了不同的版本。默认情况下,环境的配置方式甚至使全局包不可见。这样做的好处是,要获得环境中所有已安装的软件包的精确列表,只需一个pip freeze就足够了。缺点是一些较重的软件包(例如,numpy)必须安装在每个单独的环境中。不用说,哪个选择最适合您的项目取决于项目。对于大多数项目,我会保留默认设置,即不具有全局包,但是当与具有大量 C/C++扩展的项目混在一起时,只需启用全局站点包就很方便了。原因很简单,;如果没有可用的编译器,则在本地安装程序包可能会很困难,而全局安装程序有一个 Windows 可执行文件或一个 Linux/Unix 可安装程序包。
venv模块(https://docs.python.org/3/library/venv.html 可以看作是virtualenv工具(的一个稍微简化的版本 https://virtualenv.pypa.io/ ),自 3.3 版开始与 Python 捆绑(参考 PEP 0405——Python 虚拟环境: https://www.python.org/dev/peps/pep-0405/ 。
virtualenv包通常可以作为venv的替代品,这对于没有与venv捆绑的较旧 Python 版本(低于 3.3)尤其重要。
创建一个环境非常容易。基本命令归结为pyvenv PATH_TO_THE_NEW_VIRTUAL_ENVIRONMENT,让我们试一试。请注意,此命令适用于 Linux、Unix 和 Mac;Windows 命令将很快执行:
# pyvenv test_venv
# . ./test_venv/bin/activate
(test_venv) #一些 Ubuntu 发行版(尤其是 14.04 LTS)没有将完整的pyvenv包包含在ensurepip中,从而破坏了 Python 的安装。标准的解决方法是调用pyvenv --without-pip test_env,这需要通过pip主页上的get_pip.py文件手动安装pip。
这将创建一个名为test_venv的环境,第二行将激活该环境。
在 Windows 上,一切略有不同,但总体上相似。默认情况下,pyvenv命令不会在您的路径中,因此运行该命令略有不同。三个方案如下:
-
将
Python\Tools\Scripts\目录添加到您的路径中 -
运行模块:
python -m venv test_venv
-
直接运行脚本:
python Python\Tools\Scripts\pyvenv.py test_venv
为了方便起见,我建议您将Scripts目录添加到路径中,因为许多其他应用/脚本(如pip也将安装在那里。
以下是 Windows 的完整示例:
C:\envs>python -m venv test_venv
C:\envs>test_venv\Scripts\activate.bat
(test_venv) C:\envs>使用 Windows PowerShell 时,可以使用test_venv\Scripts\Activate.ps1来激活环境。注意,这里确实需要反斜杠。
到目前为止,我们刚刚创建了一个普通的venv,但是有一些非常有用的标志专门用于定制您的venv以满足您的需求。
首先,让我们看一下venv帮助:
参数
|
描述
|
| --- | --- |
| --system-site-packages | 它允许虚拟环境访问system-site-packages目录 |
| --symlinks | 当符号链接不是平台的默认值时,尝试使用而不是复制 |
| --copies | 尝试使用副本而不是符号链接,即使该平台默认使用符号链接 |
| --clear | 在创建环境之前,删除环境目录的内容(如果存在) |
| --upgrade | 升级环境目录以使用此版本的 Python,假设 Python 已经升级到位 |
| --without-pip | 此跳过在虚拟环境中安装或升级 pip(pip默认为引导) |
需要注意的最重要的参数是--system-site-packages,它在环境中启用全局站点包。这意味着,如果您在全局 Python 版本中安装了一个包,那么它也将在您的环境中可用。但是,如果您尝试将其更新为其他版本,它将在本地安装。只要可能,我建议禁用--system-site-packages标志,因为它提供了一个没有太多变量的简单环境。系统软件包的简单更新可能会破坏您的虚拟环境,但更糟糕的是,无法知道本地需要哪些软件包以及哪些软件包只是为了其他目的安装的。
要为现有环境启用此功能,只需再次运行环境创建命令,但这次添加--system-site-packages标志以启用全局站点包。
要再次禁用它,只需运行环境创建命令而不使用该标志。这将保持本地(环境中)安装的包可用,但将从 Python 范围中删除全局包。
当使用virtualenvwrapper时,也可以通过激活环境中的toggleglobalsitepackages命令来完成。
--symlinks和--copies参数通常可以忽略,但了解它们之间的区别很重要。这些参数决定文件是从基本 python 目录复制还是进行符号链接。
符号链接是 Linux/Unix/Mac 的东西;它不复制文件,而是创建一个符号链接,告诉系统在哪里可以找到实际文件。
默认情况下,venv将尝试对文件进行符号链接,如果失败,它将返回到复制。由于 Windows Vista 和 Python 3.2,Windows 上也支持此功能,因此除非您使用的是非常旧的系统,否则您很可能会在您的环境中使用符号链接。symlinks 的好处是它节省了磁盘空间,并与 Python 安装保持同步。缺点是,如果您的系统的 Python 版本进行升级,可能会破坏您环境中安装的软件包,但这可以通过使用pip重新安装软件包轻松解决。
最后,如果您的系统 Python 版本已经升级到位,--upgrade参数非常有用。此参数最常见的用例是在使用复制(而不是符号链接)环境升级系统 Python 后修复损坏的环境。
由于venv模块本质上是virtualenv的一个更简单版本,它们基本上是相同的,但有些东西是不同的。此外,由于virtualenv是一个独立于 Python 发布的包,因此它确实有一些优势。
以下是venv相对于virtualenv的优势:
venv与 Python 3.3 及以上版本一起发布,因此不需要单独安装venv简单明了,除了简单的必需品外,没有任何特色
virtualenv相对于venv的优势:
virtualenv分布在 Python 之外,因此可以单独更新。virtualenv适用于旧的 Python 版本,但建议使用 Python 2.6 或更高版本。但是,在旧版本(1.9.x 或更低版本)中可以支持 Python 2.5。- 支持方便的包装,如
virtualenvwrapper(等 http://virtualenvwrapper.readthedocs.org/
简而言之,如果venv对你来说足够,就使用它。如果您使用的是旧的 Python 版本,或者需要一些额外的便利,例如virtualenvwrapper,请使用virtualenv。这两个项目基本上做相同的事情,并且已经努力在它们之间轻松切换。两者最大也是最显著的区别在于virtualenv支持的 Python 版本种类繁多。
慢慢地,pip包管理器自 2008 年推出以来一直在取代easy_install。自 Python 3.4 以来,它甚至成为了默认版本,并与 Python 捆绑在一起。自 Python3.4 以后,无论是在常规 Python 环境中还是在pyvenv环境中,都默认安装了;在此之前,需要手动安装。要在 Python 3.4 及更高版本中自动安装pip,请使用ensurepip库。这是一个处理pip自动安装和/或升级的库,因此它至少与ensurepip捆绑的库一样新。
ensurepip的用法相当简单。只需运行 python-m ensurepip来保证pip版本,或者运行 python-m ensurepip --upgrade来确保pip至少是ensurepip捆绑的版本。
除了安装常规的pip快捷方式外,还将安装pipX和pipX.Y链接,允许您选择特定的 Python 版本。当同时使用 Python2 和 Python3 时,这允许您在 Python2 和 Python3 中分别安装带有pip2和pip3的软件包。这意味着如果在 Python3.5 上使用 python-m ensurepip,您将在您的环境中安装pip、pip3和pip3.5命令。
如果您使用的是 Python 3.4 或更高版本,ensurepip包非常棒。但是,低于此值时,您需要手动安装pip。事实上,这非常容易。它只涉及两个步骤:
-
下载的
get-pip.py文件:https://bootstrap.pypa.io/get-pip.py 。 -
Execute the
get-pip.pyfile: pythonget-pip.py.如果
ensurepip命令由于权限错误而失败,则提供--user参数可能会很有用。这允许您在用户目录specific site packages中安装pip,因此不需要 root/admin 访问权限。
大多数 Python 软件包都是纯 Python 的,非常容易安装,就像一个简单的pip install packagename软件包一样。然而,在有些情况下,需要进行编译,安装过程从简单的 pip 安装到数小时的搜索,以查看安装特定软件包需要哪些依赖项。
具体的错误消息会因项目和环境的不同而有所不同,但这些错误中有一个共同的模式,了解您所看到的内容在搜索解决方案时会有很大帮助。
例如,在标准的 Ubuntu 机器上安装pillow时,您会收到几页错误、警告和其他消息,其结尾如下:
x86_64-linux-gnu-gcc: error: build/temp.linux-x86_64-3.4/libImaging/Jpeg2KDecode.o: No such file or directory
x86_64-linux-gnu-gcc: error: build/temp.linux-x86_64-3.4/libImaging/Jpeg2KEncode.o: No such file or directory
x86_64-linux-gnu-gcc: error: build/temp.linux-x86_64-3.4/libImaging/BoxBlur.o: No such file or directory
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
----------------------------------------
Command "python3 -c "import setuptools, tokenize;__file__='/tmp/pip-build-_f0ryusw/pillow/setup.py';exec(compile(getattr(tokenize, 'open', open)(__file__).read().replace('\r\n', '\n'), __file__, 'exec'))" install --record /tmp/pip-kmmobum2-record/install-record.txt --single-version-externally-managed --compile --install-headers include/site/python3.4/pillow" failed with error code 1 in /tmp/pip-build-_f0ryusw/pillow看到这样的消息时,您可能会尝试搜索其中一行,例如x86_64-linux-gnu-gcc: error: build/temp.linux-x86_64-3.4/libImaging/Jpeg2KDecode.o: No such file or directory。虽然这可能会给你一些相关的结果,但很可能不会。这样安装的诀窍是向上滚动,直到看到有关缺少标题的消息。以下是一个例子:
In file included from libImaging/Imaging.h:14:0,
from libImaging/Resample.c:16:
libImaging/ImPlatform.h:10:20: fatal error: Python.h: No such file or directory
#include "Python.h"
^
compilation terminated.这里的关键信息是Python.h缺失。这些是 Python 头的一部分,在 Python 中编译大多数 C/C++包都需要这些头。不幸的是,根据操作系统的不同,解决方案也会有所不同。因此,我建议您跳过本段中与您的案例无关的所有部分。
在 Debian 和 Ubuntu 中,如果您仍在使用 Python 2,那么要安装的软件包是python3-dev或python2-dev。执行的命令如下:
# sudo apt-get install python3-dev但是,这仅安装开发标头。如果您希望编译器和其他头与安装捆绑在一起,那么build-dep命令也非常有用。以下是一个例子:
# sudo apt-get build-dep python3Red Hat、CentOS 和 Fedora 是基于 rpm 的发行版,它们使用yum软件包管理器来安装要求。大多数开发集管可通过<package-name>-devel获得,因此易于安装。要安装 Python 3 开发标头,请使用以下行:
# sudo apt-get install python3-devel为确保具备构建包(如 Python)所需的开发头和编译器等所有要求,yum-builddep命令可用:
# yum-builddep python3在 OS X 上安装过程包括三个步骤,然后才能安装实际的软件包。
首先,您必须安装 Xcode。此可通过位于的 OS X 应用商店完成 https://itunes.apple.com/en/app/xcode/id497799835?mt=12 。
然后您必须安装 Xcode 命令行工具:
# xcode-select --install最后,您需要安装自制软件包管理器。步骤可在上找到 http://brew.sh/ ,但安装命令如下:
# /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"其他包管理器,如Macports也是可能的,但Homebrew是目前开发和社区最活跃的 OS X 包管理器。
完成所有这些步骤后,您的应该有一个正常的自制安装。可以使用brew doctor命令验证Homebrew的工作情况。如果输出中没有重大错误,则应准备好通过 brew 安装第一个软件包。现在我们只需安装 Python,就完成了:
# brew install python3在 Windows 上,手动编译 C Python 包通常是一项非常重要的任务,至少可以这么说。大多数软件包都是在考虑 Linux/Unix 系统的情况下编写的(OSX 属于 Unix 类),Windows 对于开发人员来说是一个不错的选择。结果是软件包很难在 Windows 上编译,因为很少有人测试它们,而且许多库需要手动安装,这使得这是一项非常繁琐的任务。因此,除非您真的必须这样做,否则请尽量避免在 Windows 上手动编译 Python 包。大多数软件包都是可安装的二进制下载,只需稍加搜索,还有一些替代软件包,例如 Anaconda,其中包含用于最重要的 C Python 软件包的二进制软件包。
如果您仍然倾向于手动编译 C Python 包,那么还有另一种选择,通常这是一种更简单的选择。Cygwin 项目(http://cygwin.com/ 尝试使 Linux 应用在 Windows 上本机运行。这通常是一个比使用 VisualStudio 使包工作更容易的解决方案。
如果您确实希望采用 Visual Studio 路径,我想向您介绍第 14 章、C/C++中的扩展、系统调用和 C/C++库,其中包括手动编写 C/C++扩展以及 Python 版本所需的 Visual Studio 版本的一些信息。
随着pip和venv等包的加入,我觉得 Python 3 已经成为一个适合大多数人的完整包。除了遗留应用之外,没有真正的理由不再选择 Python3。与同年发布的全面的 Python2.6 版本相比,2008 年发布的最初 Python3 版本无疑有点粗糙,但在这方面已经发生了很大的变化。上一个主要的 Python2 版本是 Python2.7,于 2010 年发布;在软件世界里,这是一个非常非常长的时间。虽然 Python2.7 仍在接受维护,但它不会收到 Python3 所获得的任何惊人的新特性,例如默认情况下的 Unicode 字符串、dict生成器(第 6 章、生成器和协同程序–无限,一次一步)和async方法(第 7 章)、异步 IO–无线程的多线程处理。
完成本章后,您应该能够创建一个干净的、可重新创建的虚拟环境,并且知道如果 C/C++软件包安装失败,应该在哪里查找。
以下是本章最重要的注释:
- 对于干净简单的环境,请使用
venv。如果需要与 Python 2 兼容,请使用virtualenv。 - 如果 C/C++软件包安装失败,请查找有关缺少包含的错误。
下一章将介绍 Python 风格指南,哪些规则很重要,以及它们为什么重要。可读性是 Python 哲学中最重要的方面之一,您将学习编写更干净、可读性更强的 Python 代码的方法和样式。