Python3 - 开始python编程(十一)

Python3 - 开始python编程(十一)

使用模块和虚拟环境

上一篇文章中,我们介绍了有关如何构建代码的技巧,PEP 8 格式化指南以及其他一些编码原理。

今天,我们将介绍更多的工具来帮助您保持代码干净,并防止您重新发明轮子。


Packages

软件包是独立的项目,其中包含项目的可重用代码,并且与其他语言的库或框架同义。

那么包中包含什么?

在您希望在其他项目中重用的代码之外,程序包由”README.md”,”LICENSE”和”setup.py”文件组成。

  • README.md(markdown)-包含有关软件包的信息,可用于了解软件包的功能。
  • LICENSE-这是许可协议或使用条款。使用它可以让其他人知道他们是否需要给予您信誉,他们可以将其用于商业应用,是否可以进行修改和重新分配,是否不承担损害赔偿责任等等。
  • setup.py-每当您初次安装软件包时运行。它告诉 Python 任何依赖关系,并提供有关软件包的元数据,这些数据将从软件包存储库显示给用户。

在所有这些中,”setup.py”是最重要的,因为它是软件包的安装方式。

当阅读许可证时,我总是会笑出声来,当程序打印”Hello,World!”时,当有人包含“对造成的损失不承担责任”时。

撇开笑容,与世界共享您的代码时,这与 setup.py 同样重要。虽然您可能会通过编写有益的程序来赢得全世界的青睐,但如果该程序不适用于特定版本的 Python,并且您的程序损坏了系统,则即使最终用户是最终用户,您也将承担责任。在他们的计算机上运行程序。

Python 有成千上万个可供您使用的软件包。我使用过程序包来连接到 LDAP 服务器以对用户执行工作,使用程序包来远程 SSH 到另一台计算机上以运行脚本,通过程序包来运行 Web 服务器,等等。

给出了这些示例,您可能会对其他人写的内容以及对您可以写的内容有一些了解。在开始使用软件包时,您将获得更多关于如何使用它们的想法。


点命令

我们可以使用pip命令下载软件包。 pip利用名为Python Package Index,或 Pypi的软件包在线存储库。

在较早的 Python 版本中,不包含pip。在 Linux 操作系统上,有一个软件包可以安装名为 python-pip 或 python36-pip 的软件包进行安装。

pip 是一个简单的实用程序。与aptyumbrew类似,您可以搜索软件包,获取有关软件包的信息,或者安装和删除软件包。

我使用的一些最常见的命令是:

  • pip search <package_name>-搜索要安装的软件包
  • pip list-列出所有已安装的软件包
  • pip info <package_name>—获取有关已安装软件包的信息
  • pip Frozen-以需求格式提供已安装软件包的列表(稍后会详细介绍)
  • pip install <package_name>—安装软件包或以逗号分隔的软件包列表;使用pip install -U <package_name>将软件包升级到最新版本。
  • pip uninstall <package_name>-卸载软件包或以逗号分隔的软件包列表

在本系列的早期,我说过我使用Black格式化我的代码。这是通常是我在所有计算机上安装的第一个软件包。这个想法来自亨利·福特(Henry Ford)的名言[http://oplaunch.com/blog/2015/04/30/the-truth-about-any-color-so-long-as-it-is-is-black/)关于 T 型车的颜色

如果要使用它,可以使用以下命令进行安装:

pip install black

您还可以使用其他格式化程序,但是我不太在乎它们如何缩进我的代码。这完全是主观的,因此我强烈建议您在决定一项之前先将其全部检查。


虚拟环境

在安装软件包时,它们会安装到系统 Python 软件包目录中。虽然乍一看可能并不明显,但是在创建多个项目之后,这可能会造成问题。

例如,项目 A 对 Django 1.11 具有依赖关系,而项目 B 对 Django 2. 1 具有依赖关系。系统一次只能处理一个版本的 Django,这意味着当我们尝试修复另一个项目时,我们的一个项目将被破坏。

输入虚拟环境。

虚拟环境允许您创建项目本地 Python 目录,以存储该项目的所有依赖关系。这意味着项目 A 可以具有本地安装的 Django 1.11,而项目 B 可以具有自己本地安装的 Django 2. 1。

这种工作方式无需太过专业,就是 Python 创建了一个文件夹,该文件夹将可执行文件链接回创建它的 Python 版本。这使您可以在具有多个依赖项的多个项目中使用相同的 Python 解释器。

太棒了吧?不幸的是,这个很棒的工具还是一把双刃剑。如果更新创建此虚拟环境的 Python 解释器,则它可能会破坏您的代码或虚拟环境。一些软件包仅针对特定版本的 Python 设计,并使用不推荐使用的功能。当您更新到删除这些不推荐使用的功能的版本时,它将破坏该程序包。不酷吧?当然,无论如何都会发生这种情况,但这仍然是一个真实的含义。请记住,您不是在复制 Python 解释器,而是链接回它。

我们如何创建虚拟环境?

同样,如果您使用的是未安装 pip 的 Linux 发行版之一,则可能还需要安装虚拟环境软件包。您可以通过安装名为 python-venv 或 python36-venv 的软件包来实现。 (如果您想知道,某些发行版,例如 CentOS 的默认python意味着 Python 2,而python36意味着 Python 3. 6。)

安装完成后,应使用cd切换到保存项目的目录,然后使用以下命令在项目文件夹内创建一个虚拟环境目录:

1
python -m venv venv

这样做是告诉 python 使用-m odule venv 在名为 venv 的文件夹中创建虚拟环境。您可以将venv文件夹命名为任意名称,但是大多数教程和项目都可以使用venv。在*nix 系统上,可以使用.venv隐藏文件夹。

如果要使用与系统默认版本不同的 Python 版本,请改用以下命令:

1
/path/to/other/pythonx.x -m venv venv

如果您在新创建的 venv 文件夹中查看,则会看到以下文件夹:

  • bin /-包含用于此虚拟环境的 Python 可执行文件的链接。
  • lib /-包括已安装到此虚拟环境中的软件包,例如 Django 或 Black
  • include /—包含用于编译 python 包的 C 头文件
  • pyvenv.cfg-包含有关此虚拟环境的配置信息
  • pip-selfcheck.json-包含有关虚拟环境中 pip 的元数据。

创建虚拟环境之后,需要激活虚拟环境;否则,您仍将使用软件包并将其安装到默认的 Python 解释器。您可以使用以下命令执行此操作:

在 Linux 和 macOS 上:

1
source venv/bin/activate

在 Windows 上:

1
venv/bin/activate

风中因为,”activate”是指向”activate.bat”的链接,它可以激活虚拟环境。在*nix 系统上,”activate”是一个 shell 脚本,当用作内置”source”命令的参数时,其作用相同。

当您在命令提示符前看到(venv)时,便知道它已激活。

要退出虚拟环境命令提示符,可以使用deactivate

开始安装软件包时,请始终确保已激活虚拟环境。您可以在全球范围内安装某些软件包,例如 Formatter 和 Linters,因为几乎可以保证在所有项目中都使用它们。其他软件包(如 ansible)则应作为全局软件包安装。但是,当软件包或依赖项与项目中的内容冲突时,您仍然可以使用虚拟环境来安装这些软件包的旧版本。

Linters 是用于静态分析代码的工具;他们确保您遵守最佳做法。Itech[在 flake8 上写了一篇文章]https://medium.com/python-pandemonium/what-is-flake8-and-why-we-should-use-it-b89bd78073f2)_其中包括如果您想进一步了解棉绒,请与其他人联系。 Linting 与自动格式化程序不同;它仅在您的项目中显示有问题的代码;它不会更改代码的布局或为您解决这些问题。在 PyCharm 中,我使用 SonarLint_避免做愚蠢的事情。


进阶设置

最近,一位同事向我介绍了几个非常酷的实用程序。其中第一个是pyenv。 Pyenv 允许您在计算机上管理多个版本的 Python,而不会影响系统 Python。

在*nix 机器上更新系统 Python 被认为是有害的,因为某些内置应用程序可能需要特定版本的 Python。如果覆盖此内容,则可能会破坏系统。这就是 pyenv 帮忙的原因。

安装简单明了,但超出了本教程的范围。我强烈建议您仔细检查一下,然后自己尝试一下。

我使用的另一个简洁的 pip 包称为pipx。 “pipx”允许您在其虚拟环境中安装 python 软件包,然后在您的 PATH 中的”/ usr / local / bin /”中创建符号链接。这意味着您可以将 Python 程序包用作独立的应用程序(如果可行),也可以采用全局 Python 程序包(例如 Black)并使它们在系统范围内可用。

您可以像安装其他任何 pip 软件包pip install pipx一样安装它,并且该软件包将在全球范围内提供。从那里,您可以使用”pipx install black”为 Black 创建一个虚拟环境并将其提供给整个系统使用。


Requirements 文件

之前,我提到了“冻结点”和需求文件,现在我想更详细地介绍这些内容。

“pip Frozen”提供了您已安装的所有软件包的列表。它特定于您当前所处的环境,无论是系统解释器还是虚拟环境。运行此命令时,您将看到类似于以下内容的输出:

1
2
3
Django==2.2.2
pytz==2019.1
sqlparse==0.3.0

这是安装 Django 2. 2. 2 后的输出。首先,pip 下载 Django,然后运行我们之前讨论的 setup.py。在 setup.py 内部,列出了两个依赖项:pytz 和 sqlparse。这些可能是特定于版本的,通常是特定版本的,因此 pip 与 Django 一起安装。满足依赖关系后,Django 安装完成,我们可以开始一个新的 Django 项目。

我不会在本教程中介绍 Django,因为已经编写了更好的教程。

按照惯例,requirements.txt 文件是我们存储项目 pip 要求的位置。我们可以使用以下命令将此文件传递给 pip:

1
pip install -r requirements.txt

请注意,您需要与需求文件位于同一目录中,以上命令才能按原样运行。否则,您需要将相对路径传递到当前目录(即somefolder/requirements.txt)。

除了列出的软件包外,我们还用==分隔版本号。这意味着匹配此确切版本。如果需要较早的版本,可以更改版本号,而改为接收该版本。

如果您想确保新安装总是更新到最新版本,则可以 ld 最后省略==#。#。#

另外,如果您想安装特定版本,可以使用<=,其中将包括您指定的版本,或者使用«来获得最新软件包,只要它小于您指定的版本。

如果要确保始终获得比特定版本大的版本,则可以使用>> =

最后,您可以将结尾处具有> = 0.2,<0.3’的两者混合使用,以表示大于或等于 0.2 且小于 0.3。这意味着将安装 0.2. 1,而拒绝 0.25 或 0.3。

由于输出重定向,“点冻结”派上用场了。您可以使用 pip Frozen> requirements.txt 将输出发送到名为 requirements.txt 的文件。如果文件不存在,将创建该文件;否则,内部的文本将被替换。如果出于某种原因想要添加文本(不建议),则可以使用>>

使用输出重定向可以节省大量时间来创建需求文件。我想做的是将所有测试要求与生产要求分开。这样,诸如 pytest 或 coverage 之类的软件包就不会安装到生产环境中。我将所有这些文件放入在测试阶段安装的test_requirements.txt文件中。

我清理需求文件的另一件事是运行 在每个软件包上使用pip show <package>来确定每个软件包需要什么。 pip show Django`的输出显示为”Requires:pytz,sqlparse”。

基于此,我可以从需求文件中删除 pytz 和 sqlparse。您可以按任意顺序执行此操作,但是通常我会从核心要求(例如 Django 或 Flask)转到其他我可能需要其他程序包的地方,然后从头到尾完成其余程序包。

请注意,如Peter在下面的注释中。有关原因的更多详细信息,请参见他的回复。

我这样做是因为有时我可能希望 Django 更新到下一个版本,该版本可能还包含更新的软件包要求。如果它是一个关键应用程序,则应保留所有列出的软件包,如果不进行仔细检查就不应更新。

如果您不知道哪些可能,请不要担心;这伴随着时间和打包经验。


摘要

今天,我们介绍了一些软件包,这些软件包可以帮助我们使用预先编写的代码来执行任务,`pip 允许我们安装这些软件包以及虚拟环境,以便我们可以保持开发环境的清洁。我们还介绍了需求文件,以及在与他人共享应用程序或将应用程序安装到其他环境中时如何使用它们来确保安装所有依赖项。

链接

如果您想了解有关创建自己的软件包或将软件包上传到 Pypi 的更多信息,请查阅 Python 打包用户指南。

Python 打包用户指南— Python 打包用户指南

如果您想了解有关安装软件包和虚拟环境的更多信息,请查看此指南:

安装软件包-Python 打包用户指南

这些也在docs.python.org上。

安装 Python 模块— Python 3. 7.3 文档


下一步是什么?

我们已经走了很长一段路。我打算写有关异步的文章,但我认为先介绍迭代器和生成器可能会更有益。两者都允许您遍历序列,我们将学习它们如何相似,如何不同以及如何使用它们来改进我们的代码。

在此之前,请练习所学内容!

Rating: