Python 是一种出色的通用编程语言,通常作为第一门编程语言教授。二十年过去了,写了很多书,它仍然是我选择的语言。虽然人们常说这种语言很简单,但为开发配置 Python 却并非如此(正如 xkcd 所记录的那样)。

复杂的 Python 环境:xkcd
有很多方法可以在日常生活中使用 Python。我将解释我如何使用 Python 生态系统工具,并且我会诚实地说明我仍在寻找替代方案的地方。
使用 pyenv 管理 Python 版本
我发现让 Python 版本在您的机器上工作的最佳方法是 pyenv
。此软件可在 Linux、Mac OS X 和 WSL2 上运行:这三个我通常关心的“类 UNIX”环境。
安装 pyenv
本身有时可能有点棘手。一种方法是使用专门的 pyenv 安装程序,它使用 curl | bash
方法进行引导(有关更多详细信息,请参阅说明)。
如果您使用的是 Mac(或运行 Homebrew 的其他系统),您可以按照 此处 的说明安装和使用 pyenv。
一旦您按照说明安装并设置了 pyenv
,您可以使用 pyenv global
设置“默认 Python”版本。一般来说,您会想要选择您“最喜欢”的版本。这通常是最新的稳定版本,但其他考虑因素可能会改变这一点。
使用 virtualenvwrapper 简化虚拟环境
使用 pyenv
安装 Python 的一个优点是,您关心的所有后续 Python 解释器安装都归您所有,而不是您使用的操作系统。
虽然在 Python 本身内部安装东西通常不是最佳选择,但有一个例外:在您上面选择的“最喜欢”的 Python 中,安装并配置 virtualenvwrapper
。这使您能够立即创建和切换到虚拟环境。
我在 本文 中详细介绍了如何安装和使用 virtualenvwrapper
。
在这里,我推荐一个独特的工作流程。您需要创建一个虚拟环境,以便您可以多次重复使用它——runner
。在这个环境中,安装您最喜欢的 runner
;也就是说,您将定期用于运行其他软件的软件。截至今天,我的偏好是 tox
。
使用 tox 作为 Python 运行器
tox 是一个很棒的工具,可以自动化您的 Python 测试运行。在每个 Python 环境中,我都会创建一个 tox.ini
文件。我用于持续集成的任何系统都会运行它,我也可以使用上面文章中描述的 virtualenvwrapper
的 workon 语法在本地运行相同的系统
$ workon runner
$ tox
此工作流程重要的原因是,我针对多个 Python 版本和库依赖项的多个版本测试我的代码。这意味着 tox 运行器中将存在多个环境。有些将尝试针对最新的依赖项运行。有些将尝试针对冻结的依赖项运行(稍后会详细介绍),我也可能使用 pip-compile
在本地生成这些依赖项。
旁注:我目前正在查看 nox
作为 tox
的替代品。原因超出了本文的范围,但值得一看。
使用 pip-compile 进行 Python 依赖项管理
Python 是一种动态编程语言,这意味着它在每次代码执行时都会加载其依赖项。准确了解正在运行的每个依赖项的版本可能意味着代码顺利运行和意外崩溃之间的区别。这意味着我们必须考虑依赖项管理工具。
对于每个新项目,我都包含一个 requirements.in
文件,该文件(通常)仅包含以下内容
.
是的,没错。只有一行,只有一个点。我在 setup.py
文件中记录了“松散”的依赖项,例如 Twisted>=17.5
。这与精确的依赖项(如 Twisted==18.1
)形成对比,后者使您在需要功能或错误修复时更难升级到库的新版本。
.
表示“当前目录”,它使用当前目录的 setup.py
作为依赖项的来源。
这意味着使用 pip-compile requirements.in > requirements.txt
将创建一个冻结的依赖项文件。您可以在 virtualenvwrapper
创建的虚拟环境或 tox.ini
中使用此依赖项文件。
有时拥有从 requirements-dev.in
(内容:.[dev]
)生成的 requirements-dev.txt
或从 requirements-test.in
(内容:.[test]
)生成的 requirements-test.txt
很有用。
我正在研究是否应该用 dephell
替换此流程中的 pip-compile
。dephell
工具有很多有趣的功能,例如使用异步 HTTP 请求来处理依赖项下载。
结论
Python 既强大又赏心悦目。为了编写该代码,我依靠一个对我来说效果很好的特定工具链。pyenv
、virtualenvwrapper
、tox
和 pip-compile
这些工具都是独立的。但是,它们各自都有自己的角色,没有重叠,并且它们共同提供了一个强大的 Python 工作流程。
1 条评论