Skip to content

Latest commit

 

History

History
577 lines (365 loc) · 34.1 KB

File metadata and controls

577 lines (365 loc) · 34.1 KB

二、建立你的开发环境

Python 编程中一个重要但经常被忽略的方面是如何正确设置和维护 Python 项目及其运行时环境。它经常被忽略,因为它是 Python 生态系统的可选步骤。虽然这对于学习 Python 语言基础知识来说可能很好,但对于更复杂的项目来说,这可能很快成为一个问题,因为我们需要维护单独的代码库和依赖项,以确保我们的项目不会相互干扰,或者更糟的是,我们将讨论破坏操作系统工具和实用程序。

因此,在我们在后面的章节中讨论IoT代码和示例之前,我们必须先介绍一下设置 Python 项目及其运行时环境所需的步骤。

在本章中,我们将介绍以下主题:

  • 了解 Python 安装
  • 设置 Python 虚拟环境
  • 使用pip安装 Python GPIO 包
  • 执行 Python 脚本的替代方法
  • Raspberry Pi GPIO 接口配置

技术要求

要执行本章中的动手练习,您需要以下内容:

  • 树莓皮 4 B 型
  • Raspbian OS Buster(带桌面和推荐软件)
  • 最低 Python 版本 3.5

这些需求是本书中代码示例的基础。只要您的 Python 版本是 3.5 或更高版本,就可以合理地期望代码示例在 Raspberry Pi 3 Model B 或不同版本的 Raspbian OS 上无需修改即可工作。

本书的完整源代码可以在 GitHub 上的以下 URL 上找到:https://github.com/PacktPublishing/Practical-Python-Programming-for-IoT 。在设置 Python 虚拟环境一节中,我们将很快克隆这个存储库。

了解 Python 安装

在本节中,我们将了解您在 Raspberry Pi 上安装了哪些 Python 版本。我们将发现,有两个版本的 Python 预装在 Raspbian 操作系统上。基于 Unix 的操作系统(如 Raspbian OS)通常预先安装了 Python 版本 2 和 3,因为有使用 Python 构建的操作系统级实用程序。

要了解 Raspberry Pi 上的 Python 版本,请执行以下步骤:

  1. 打开新终端,执行python --version命令:
$ python --version
Python 2.7.16

在我的示例中,我们看到已经安装了 Python 版本 2.7.16。

  1. 接下来,运行python3 --version命令:
$ python3 --version
Python 3.7.3

在我的示例中,我们看到 Python 的第二个版本(即安装了3python3)是版本 3.7.3。

如果次要版本(2 后面的数字.7.16 和 3 后面的数字.7.3)不一样,不要担心;感兴趣的是主要版本 2 和 3。Python2 是 Python 的遗留版本,而 Python3 是编写本文时最新且受支持的 Python 版本。当我们开始一个新的 Python 开发时,我们实际上总是使用 Python3,除非有遗留问题需要解决。

Python 2 officially became end-of-life in January 2020. It is no longer maintained and will not receive any further enhancements, bug fixes, or security patches.

如果您是一名经验丰富的 Python 程序员,您可能能够辨别脚本是为 Python 2 还是为 Python 3 编写的,但仅仅看一段代码并不总是很明显。许多新加入 Python 的开发人员都会因将 Python 程序和用于不同 Python 版本的代码片段混为一谈而感到沮丧。请始终记住,为 Python 2 编写的代码在没有修改的情况下,不能保证与 Python 3 具有较高的可比性。

我可以与大家分享一个快速技巧,以直观地帮助确定代码片段是为哪个 Python 版本编写的(如果程序员在代码注释中没有明确说明),那就是寻找一个print语句。

如果你看下面的例子,你会发现有两个print语句。第一个不带括号的print语句是一个让步,它只适用于 Python 2:

print "Hello"  # No parentheses - This only works in Python 2, a dead give-away that this script is for Python 2.

print("Hello") # With parentheses - this will work in Python 2 and Python 3

当然,您总是可以针对 Python2 和 Python3 运行代码,看看会发生什么。

我们现在已经看到在 Raspbian OS 上默认有两个 Python 版本可用,并且提到有一些用 Python 编写的系统级实用程序在这些版本上进行响应。作为 Python 开发人员,我们必须注意不要中断全局 Python 安装,因为这可能会破坏系统级实用程序。

我们现在将注意力转向一个非常重要的 Python 概念,即 Python 虚拟环境,这是我们将自己的 Python 项目从全局安装中分离出来的方式。

设置 Python 虚拟环境

在本节中,我们将讨论 Python 如何与您的操作系统安装交互,并介绍设置和配置 Python 开发环境所需的步骤。此外,作为安装过程的一部分,我们将克隆包含本书所有代码(按章节组织)的 GitHub 存储库。

默认情况下,Python 及其包管理工具pip在系统级别上全局运行,可能会给 Python 初学者带来一些困惑,因为这种全局默认与默认情况下在项目文件夹级别本地运行的许多其他语言生态系统形成对比。不停地工作和更改全局 Python 环境可能会破坏基于 Python 的系统级工具,纠正这种情况可能会成为一个主要的头痛问题。

作为 Python 开发人员,我们使用 Python 虚拟环境对我们的 Python 项目进行沙箱处理,这样它们就不会对系统级 Python 实用程序或其他 Python 项目产生负面影响。

在本书中,我们将使用一个名为venv的虚拟环境工具,c omes 将其作为内置模块与 Python3.3 及更高版本捆绑在一起。周围还有其他虚拟环境工具,它们都有各自的优缺点,但它们都有一个共同的目标,即将 Python 依赖项与项目隔离。

virtualenv and pipenv are two alternative virtual environment tool options that offer more features than venv. These alternatives are well suited for complex Python projects and deployments. You'll find links to these in the Further reading section at the end of this chapter.

让我们开始克隆 GitHub 存储库,并为本章的源代码创建一个新的 Python 虚拟环境。打开一个新的终端窗口并执行以下步骤:

  1. 切换到或创建一个文件夹,在其中存储本书的源代码,并执行以下命令。使用最后一个命令,我们将克隆的文件夹重命名为pyiot。这有助于缩短本书中的终端命令示例:
$ cd ~
$ git clone https://github.com/PacktPublishing/Practical-Python-Programming-for-IoT
$ mv Practical-Python-Programming-for-IoT pyiot 
  1. 接下来,切换到chapter01文件夹,其中包含与本章相关的代码:
$ cd ~/pyiot/chapter01
  1. 执行以下命令,使用venv工具创建一个新的 Python 虚拟环境。输入python3(使用 3)并记住venv仅在 Python 3.3 及以上版本中可用,这一点很重要:
$ python3 -m venv venv

我们传递给python3的选项包括-m venv,它告诉 Python 解释器我们想要运行名为venv的模块。venv参数是将在其中创建虚拟环境的文件夹的名称。

While it might look confusing at first glance in the preceding command, it's a common convention to name a virtual environment's folder venv. Later in this chapter, in the Anatomy of a virtual environment section, we will explore what lies beneath the venv folder we just created.

  1. 要使用 Python 虚拟环境,我们必须激活它,这是通过activate命令完成的:
# From with in the folder ~/pyiot/chapter01
$ source venv/bin/activate
(venv) $

当您的终端激活了一个 Python 虚拟环境时,所有与 Python 相关的活动都会沙盒到您的虚拟环境中。

Notice in the preceding code that, after activation, the name of the virtual environment, venv, is shown as part of the Terminal prompt text, that is, (venv) $. In this book, whenever you see Terminal examples where the prompt is (venv) $, it's a reminder that commands need to be executed from within an activated Python virtual environment.

  1. 接下来,在终端中执行which python而不执行3,注意 Python 可执行文件的位置在您的venv文件夹下,如果您检查 Python 版本,则为 Python 版本 3:
(venv) $ which python
/home/pi/pyiot/chapter01/venv/bin/python

(venv) $ python --version
Python 3.7.3
  1. 要离开激活的虚拟环境,请使用deactivate命令,如下所示:
(venv) $ deactivate
$ 

还请注意,一旦虚拟环境被停用,(venv) $不再是终端提示文本的一部分。

Remember to type deactivate to leave a virtual environment, not exit. If you type exit in a virtual environment, it will exit the Terminal.

  1. 最后,如果您再次执行which python(没有3)和python --version,那么现在您不在我们的 Python 虚拟环境中,请注意,我们回到了默认的系统级 Python 解释器,即版本 2:
$ which python
/usr/bin/python

$ python --version
Python 2.7.13

正如我们在前面的示例中所示,当我们在一个激活的虚拟环境中运行python --version时,我们看到它是 Python 版本 3,而在本章开头的最后一个示例中,系统级别python --version是版本 2,我们需要为版本 3 键入python3 --version。实际上,python(没有编号)与 Python 的默认版本相关。在全球范围内,这是第 2 版。在您的虚拟环境中,我们只有一个 Python 版本,即版本 3,因此它成为默认版本。

A virtual environment created with venv inherits (via a symbolic link) the global Python interpreter version that it was invoked with (in our case, version 3 because the command was python3 -m venv venv ). If you ever need to target a specific Python version that is different from the global version, investigate the virtualenv and pipenv virtual environment alternatives.

我们现在已经了解了如何创建、激活和停用 Python 虚拟环境,以及为什么使用虚拟环境对 Python 项目进行沙箱处理很重要。这种沙箱意味着我们可以将自己的 Python 项目及其库依赖项彼此隔离开来,并防止我们可能中断 Python 的系统级安装,破坏依赖它们的任何系统级工具和实用程序。

接下来,我们将看到如何使用pip在虚拟环境中安装和管理 Python 包。

使用 pip 安装 Python GPIO 包

在本节中,我们将学习如何在上一节中创建和探索的 Python 虚拟环境中安装和管理 Python。Python(或者(如果您喜欢这个术语)允许我们用新的特性和功能扩展核心 Python 语言。

我们需要在本书中安装许多不同的软件包,但是,对于初学者,为了探索和学习与软件包安装和管理相关的基本概念,我们将在本节中安装两个通用的 GPIO 相关软件包,我们将在本书中使用它们。这两个软件包如下:

  • GPIOZero库,一个入门级且易于使用的 GPIO 库,用于控制简单的电子设备
  • PiGPIO库,一个先进的 GPIO 库,具有许多功能,用于更复杂的电子接口

在 Python 生态系统中,包管理是通过pip命令完成的(pip代表Python 安装包pip查询的官方公共包存储库称为Python 包索引或简称PyPi,可在网站上浏览 https://pypi.org.

Similarly to python and python3, there is pip and pip3. pip (without the number) will be the default pip command that is matched to the default python command in a given virtual environment.

本书中会有一些代码示例,我们将与 Raspberry Pi 的 GPIO 引脚进行交互,因此我们需要安装一个(或两个)Python 包,以便 Python 代码可以与 Raspberry Pi 的 GPIO 引脚一起工作。现在,我们将检查并安装两个与 GPIO 相关的软件包。在第 2 章Python 和 IoT 入门第 5 章将树莓 Pi 连接到物理世界中,我们将更详细地介绍这些 GPIO 包和其他替代方案。

在您的chapter01源代码文件夹中,您将找到一个名为gpio_pkg_check.py的文件,该文件将在下面复制。我们将使用此文件作为基础来了解 Python 虚拟环境中的pip和包管理。此脚本仅报告 Python 包的可用性,具体取决于使用import是否成功或引发异常:

"""
 Source File: chapter01/gpio_pkg_check.py 
"""
try:
 import gpiozero
 print('GPIOZero Available')
except:
 print('GPIOZero Unavailable. Install with "pip install gpiozero"')

try:
 import pigpio
 print('pigpio Available')
except:
 print('pigpio Unavailable. Install with "pip install pigpio"')

让我们使用gpio_pkg_check.pypip检查 GPIO 包的可用性。我将告诉您,它们将不会在您新创建的虚拟环境中可用(但现在),以消除悬念,但是,我们将安装它们!

Note: They are already installed at the system level if you want to check yourself by running this script outside of your virtual environment.

以下步骤将引导我们完成升级pip、探索工具选项和安装软件包的过程:

  1. 作为第一步,我们将升级pip工具。在终端窗口中,运行以下命令,记住后面的所有命令必须在激活的v 虚拟环境中执行,这意味着您应该在终端提示符中看到文本(venv)
(venv) $ pip install --upgrade pip
...output truncated...

前面的upgrade命令可能需要一两分钟才能完成,并且可能会向终端输出大量文本。

Are you facing pip problems? If you're getting a sea of red errors and exceptions when trying to install a package with pip, try upgrading the pip version as a first step using pip install --upgrade pip. It is a recommended first step after creating a fresh Python virtual environment to upgrade pip.

  1. 现在升级了pip之后,我们可以使用pip list命令查看虚拟环境中已经安装了哪些 Python 包:
(venv) $ pip list
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (33.1.1)

我们在前面看到的是新虚拟环境中的默认 Python 包。如果确切的软件包列表或版本号与示例不完全匹配,请不要担心。

  1. 使用python gpio_pkg_check.py 命令运行 Python 脚本,并观察我们的 GPIO 包是否安装:
(venv) $ python gpio_pkg_check.py
GPIOZero Unavailable. Install with "pip install gpiozero"
pigpio Unavailable. Install with "pip install pigpio"
  1. 要安装我们所需的两个 GPIO 软件包,我们使用pip install命令,如下例所示:
(venv) $ pip install gpiozero pigpio
Collecting gpiozero...
... output truncated ...
  1. 现在,再次运行pip list命令;我们将看到这些新软件包现在安装在我们的虚拟环境中:
(venv) $ pip list
colorzero (1.1)
gpiozero (1.5.0)   # GPIOZero
pigpio (1.42)      # PiGPIO
pip (9.0.1)
pkg-resources (0.0.0)
setuptools (33.1.1)

您可能已经注意到,有一个名为colorzero(这是一个颜色处理库)的包,我们没有安装。gpiozero(1.5.0 版)依赖colorzero,所以pip自动为我们安装。

  1. 重新运行python gpio_pkg_check.py,我们现在看到我们的 Python 模块可供导入:
(venv) $ python gpio_pkg_check.py
GPIOZero Available
pigpio Available

伟大的我们现在有一个安装了两个 GPIO 包的虚拟环境。在处理 Python 项目时,不可避免地会安装越来越多的包,并希望跟踪它们。

  1. 使用pip freeze命令拍摄您以前安装的软件包的快照:
(venv) $ pip freeze > requirements.txt

前面的示例所有已安装的软件包冻结到名为requirements.txt的文件中,该文件是用于此目的的常用文件名。

  1. 查看requirements.txt文件,您将看到列出的所有 Python 包及其版本号:
(venv) $ cat requirements.txt
colorzero==1.1
gpiozero==1.5.0
pigpio==1.42
pkg-resources==0.0.0

将来,如果您将 Python 项目移动到另一台机器或新的虚拟环境,您可以使用requirement.txt文件使用pip install -r requirements.txt命令一次性安装所有捕获的软件包。

Our requirements.txt example shows we have installed GPIOZero version 1.5.0, the current version at the time of writing. This version has a dependency on ColorZero version 1.1. It is possible that different (past or future) versions of GPIOZero may have different dependencies than those shown in our example, so your own requirements.txt file when performing the example exercise may be different.

我们现在已经使用pip完成了 Python 包的基本安装生命周期。请注意,无论何时使用pip install安装新软件包,都需要重新运行pip freeze > requirements.txt以捕获新软件包及其依赖项。

为了完成我们对pip和包管理的探索,下面是一些其他常见的pip命令:

# Remove a package
(venv) $ pip uninstall <package name>

# Search PyPi for a package (or point your web browser at https://pypi.org)
(venv) $ pip search <query text>

# See all pip commands and options (also see Further Reading at the end of the chapter).
(venv) $ pip --help

祝贺我们已经达到了一个里程碑,涵盖了可以用于任何 Python 项目的基本虚拟环境原则,即使是与 Raspberry Pi 无关的项目!

During your Python journey, you will also come across other package installers and tools named easy_install and setuptools . Both have their uses; however, it's pip that you will rely on most of the time.

现在,我们已经看到了如何创建一个虚拟环境并安装包,让我们来看看一个典型的 Python 项目文件夹结构,如 AutoT0A.和发现什么是在下面的 Ty1 T1 文件夹。

虚拟环境的剖析

本节涉及我们在本章中使用的venv,将适用于virtualenv,但不适用于pipenv,我们将其列为替代虚拟环境工具。该示例也特定于 Raspbian 操作系统,是基于 Unix 的标准操作系统的典型示例。至少了解虚拟环境部署的基本结构很重要,因为我们将把自己的 Python 编程代码与构成虚拟环境的文件和文件夹混合在一起。

The light weight venv tool that comes with Python 3.3 and above is a subset of virtualenv .

下面是我们虚拟环境的文件夹结构。是的,这是 Mac 电脑的屏幕截图。这样我就可以立即在屏幕上显示所有内容:

Figure 1.1 – Contents of a typical venv virtual environment folder

以下几点解释了在我们运行python3 -m venv venv并使用pip安装软件包之后在~/pyiot/chapter01文件夹中找到的核心子文件夹:

  • venv 文件夹包含所有 Python 虚拟环境文件。没有实际需要手动触摸此文件夹下的任何内容,让工具为您完成。请记住,文件夹名为venv只是因为它创建时我们称之为venv

  • venv/bin文件夹包含 Python 解释器(在venv案例中,有指向系统解释器的符号链接)和其他核心 Python 工具,包括pip

  • venv/lib文件夹下面是虚拟环境的所有沙盒 Python 包,包括我们使用pip install安装的 GPIOZero 和 PiGPIO 包。

  • 我们的 Python 源文件gpio_pkg_check.py位于顶层文件夹~/pyiot/chapter01中;但是,您可以在此处创建子文件夹,以帮助组织代码和非代码文件。

  • 最后,requirements.txt按照惯例生活在顶部项目文件夹中。

虚拟环境文件夹venv实际上不需要保存在项目文件夹中;然而,使用activate命令将其激活通常很方便。

Your venv folder and anything below it should not be added to your source version control system, but you should add requirements.txt. As long as you ha ve a current requirements.txt file, you can always recreate your virtual environment and reinstate packages to a known state.

重要的是要理解,作为一名 Python 开发人员,您将在自己的编程代码中混合构成虚拟环境系统一部分的文件和文件夹,并且在选择将哪些文件和文件夹添加到版本控制系统(如果您使用的话)时,您应该实事求是。

最后一点很重要,因为虚拟环境系统的大小可以达到很多兆字节(通常比您的程序代码大很多倍),而不需要版本控制(因为只要我们有一个requirements.txt文件,我们就可以始终重新创建虚拟环境),加上它的主机平台特定(也就是说,Windows、Mac 和 Linux 之间会有差异),加上不同的虚拟环境工具(例如,venvpipenv之间会有差异)。因此,虚拟环境在涉及许多在不同计算机上工作的开发人员的项目中通常是不可移植的。

现在,我们已经简要地探讨了文件和文件夹结构以及理解此结构的重要性,我们将继续研究运行沙盒到虚拟环境中的脚本的其他方法。

执行 Python 脚本的替代方法

让我们简要地将注意力转向执行 Python 脚本的其他方法。正如我们将了解到的,选择合适的方法完全是基于您打算如何以及从何处启动脚本,以及您的代码是否需要提升权限。

运行 Python 脚本最常见的方式是从其虚拟环境中运行,并具有当前登录用户的权限。但是,在某些情况下,我们需要以 root 用户身份或从激活的虚拟环境外部运行脚本。

以下是我们将探讨的方法:

  • 在虚拟环境中使用sudo
  • 在虚拟环境之外执行 Python 脚本
  • 在启动时运行 Python 脚本

让我们从学习如何使用 root 用户权限运行 Python 脚本开始。

在虚拟环境中使用 sudo

我确信,在处理 Raspberry Pi 时,您必须在带有sudo前缀的终端中执行命令,因为它们需要根权限。如果需要以 root 用户身份运行虚拟环境中的 Python 脚本,则必须使用虚拟环境的 Python 解释器的完整路径。

如下面的示例所示,在python之前简单地加上sudo前缀在大多数情况下都不起作用,即使我们在虚拟环境中。sudo操作将使用根用户可用的默认 Python,如示例的后半部分所示:

# Won't work as you might expect!
(venv) $ sudo python my_script.py

# Here is what the root user uses as 'python' (which is actually Python version 2).
(venv) $ sudo which python
/usr/bin/python

以 root 用户身份运行脚本的正确方法是将绝对路径传递给虚拟环境的 Python 解释器。我们可以在激活的虚拟环境中使用which python命令找到绝对路径:

(venv) $ which python
/home/pi/pyiot/chapter01/venv/bin/python

现在,我们sudo我们虚拟环境的 Python 解释器,脚本将以根用户的身份运行*,并在我们虚拟环境的内容中运行:*

(venv) $ sudo /home/pi/pyiot/chapter01/venv/bin/python my_script.py

接下来,我们将看到如何从虚拟环境外部运行在虚拟环境中沙盒的 Python 脚本。

在虚拟环境之外执行 Python 脚本

前面关于sudo的讨论的一个自然扩展是*如何从虚拟环境之外运行 Python 脚本?*答案与上一节相同:只需确保您使用的是虚拟环境 Python 解释器的绝对路径。

Note: In the following two examples, we're not in a virtual environment—there is no $ (venv) on the prompt. If you still need to exit your Python virtual environment, type deactivate.

以下命令将以当前登录的用户(默认为pi用户)身份运行脚本:

# Run script as logged-in user.
$ /home/pi/pyiot/chapter01/venv/bin/python gpio_pkg_check.py

或者以 root 用户身份运行脚本,前缀为sudo

# Run script as root user by prefixing sudo
$ sudo /home/pi/pyiot/chapter01/venv/bin/python gpio_pkg_check.py

因为我们使用的是虚拟环境的 Python 解释器,所以我们仍然将沙盒放在虚拟环境中,并且我们安装的任何 Python 包都是可用的。

接下来,我们将学习如何在启动 Raspberry Pi 时运行 Python 脚本。

在启动时运行 Python 脚本

总有一天,你会开发出一个很棒的物联网项目,你希望它在你每次启动覆盆子 Pi 时自动运行。下面是一种使用 Unix 调度器的特性cron实现这一点的简单方法。如果您不熟悉cron的基础知识,请在 web 上搜索 cron 教程,您会发现大量的教程。我在进一步阅读部分提供了策划链接。

以下是配置 cron 并使脚本在引导时运行的步骤:

  1. 在项目文件夹中,创建 bash 脚本。我把它命名为run_on_boot.sh
#!/bin/bash

# Absolute path to virtual environment python interpreter
PYTHON=/home/pi/pyiot/chapter01/venv/bin/python

# Absolute path to Python script
SCRIPT=/home/pi/pyiot/chapter01/gpio_pkg_check.py

# Absolute path to output log file
LOG=/home/pi/pyiot/chapter01/gpio_pkg_check.log

echo -e "\n####### STARTUP $(date) ######\n" >> $LOG
$PYTHON $SCRIPT >> $LOG 2>&1

这个 bash 脚本将使用脚本及其 Python 解释器的绝对路径运行 Python 脚本。此外,它还捕获任何脚本输出并将其存储在日志文件中。对于这个例子,我们只需要在引导时运行并记录gpio_pkg_check.py的输出。这是最后一行,它将所有内容联系在一起,并运行和记录我们的 Python 脚本。末尾的2>&1部分是必要的,以确保除了标准输出外,还记录了错误。

  1. run_on_boot.sh文件标记为可执行文件:
$ chmod u+x run_on_boot.sh

如果您不熟悉chmod命令(chmod表示更改模式),我们所做的是授予操作系统执行run_on_boot.sh文件的权限。u+x参数表示*对于当前User,使文件 eX可执行。*要了解更多关于chmod的信息,您可以在终端中键入chmod --helpman chmod

  1. 编辑您的crontab文件,该文件是存储 cron 调度规则的文件:
$ crontab -e
  1. 使用我们在步骤 1中创建的run_on_boot.shbash 脚本的绝对路径,将以下条目添加到您的crontab文件中:
@reboot /home/pi/pyiot/chapter01/run_on_boot.sh &

不要忘记这行末尾的&字符。这确保脚本在后台运行。

  1. 在终端中手动运行run_on_boot.sh文件,确保其正常工作。应创建gpio_pkg_check.log文件并包含 Python 脚本的输出:
$ ./run_on_boot.sh
$ cat gpio_pkg_check.log
####### STARTUP Fri 13 Sep 2019 03:59:58 PM AEST ######
GPIOZero Available
PiGPIO Available
  1. 重新启动 Raspberry Pi:
$ sudo reboot
  1. 一旦 Raspberry Pi 完成重新启动,gpio_pkg_check.log文件现在应该包含额外的行,表明脚本确实在启动时运行:
$ cd ~/pyiot/chapter01
$ cat gpio_pkg_check.log

####### STARTUP Fri 13 Sep 2019 03:59:58 PM AEST ######

GPIOZero Available
PiGPIO Available

####### STARTUP Fri 13 Sep 2019 04:06:12 PM AEST ######

GPIOZero Available
PiGPIO Available

如果重新启动后您在 gpio_pkg_check.log 文件中没有看到额外的输出,请再次检查您在crontab中输入的绝对路径是否正确,以及它是否按照步骤 5手动工作。另外,查看系统日志文件/var/log/syslog,并搜索文本run_on_boot.sh

Our cron**-**based example of running a script on boot is one of many options that are available in Unix-based operating systems such as Raspbian. Another common and more advanced option using systemd can be found on the Raspberry Pi website at https://www.raspberrypi.org/documentation/linux/usage/systemd.md. Irrespective of the option you prefer, the key point to remember is to ensure your Python scripts run from within their virtual environment.

我们现在已经学习了运行 Python 脚本的替代方法,这将帮助您在开发基于 Python 的 IoT 项目后正确运行这些项目,或者在需要时在 Raspberry Pi 启动时启动这些项目。

接下来,我们将继续确保为 GPIO 和电子接口正确设置和配置 Raspberry Pi,我们将在下一章、第 2 章Python 入门和**IoT以及后续章节中深入讨论。

*# 在 Raspberry Pi 上配置 GPIO 接口

在开始使用 Python GPIO 库和控制电子设备之前,我们需要执行的一项任务是在 Raspberry Pi 上启用 GPIO 接口。尽管我们已经安装了用于 GPIO 控制的 Python 包,但我们并没有告诉 Raspbian 操作系统我们希望在特定情况下使用 Raspberry Pi 的 GPIO 引脚。我们现在就开始吧。

以下是要遵循的步骤:

  1. 从 Raspbian 桌面,导航至 Raspberry 菜单|首选项| Raspberry Pi 配置,如图 1.2 所示:

Figure 1.2 – Location of the Raspberry Pi Configuration menu item Alternatively, interfaces can be managed at the command line with the sudo raspi-config command and navigating to the Interfacing Options menu.

  1. 启用所有界面,如以下屏幕截图所示:

Figure 1.3 - Raspberry Pi Configuration Dialog

  1. 单击 OK 按钮。

单击 OK 按钮后,可能会提示您重新启动 Raspberry Pi;但是,暂时不要确认重新启动,因为我们还需要先执行一项任务。我们将在下一步讨论这个问题。

配置 PiGPIO 守护进程

我们还需要启动 PiGPIO 守护进程,这是一个需要运行的系统服务,以便我们可以使用 PiGPIO GPIO 客户端库,我们将在第 2 章开始使用 Python 和 IoT

Architecturally, the PiGPIO library comprises two parts — a server service and a client that communicates over local pipes or sockets to the service. We will cover more about this basic architecture in Chapter 5, Connecting Your Raspberry Pi to the Physical World.

在终端中执行以下操作。这将启动 PiGPIO 守护程序,并确保在 Raspberry Pi 引导时自动启动 PiGPIO 守护程序:

$ sudo systemctl enable pigpiod
$ sudo systemctl start pigpiod

现在,是时候重新启动你的树莓皮了!所以,休息一下,让你的覆盆子圆周率重新开始。你应得的,因为我们已经覆盖了很多!

总结

在本章中,我们探讨了 Python 生态系统,它是典型的基于 Unix 的操作系统(如 Raspbian OS)的一部分,并了解到 Python 是操作系统工具的核心元素。然后,我们介绍了如何创建和导航 Python 虚拟环境,这样我们就可以沙箱我们的 Python 项目,这样它们就不会相互干扰或干扰系统级的 Python 生态系统。

接下来,我们学习了如何使用 Python 包管理工具pip在虚拟环境中安装和管理 Python 库依赖项,我们通过安装 GPIOZero 和 PiGPIO 库来实现这一点。由于有时我们需要作为根用户从虚拟环境外部或在启动过程中执行 Python 脚本,因此我们还介绍了这些不同的技术。

默认情况下,Raspbian 没有启用其所有 GPIO 接口,因此我们执行了启用这些功能所需的配置,以便在后面的章节中可以随时使用这些功能。我们还开始并学习了如何设置 PiGPIO 守护进程服务,以便它在每次启动 Raspberry Pi 时启动。

您在本章中获得的核心知识将帮助您为自己的物联网(和非物联网)项目正确设置和导航沙盒 Python 开发环境,并安全地安装库依赖项,以便它们不会干扰其他 Python 项目或 Python 的系统级安装。您对执行 Python 程序的不同方式的理解也将有助于您使用提升的用户权限(即,作为根用户)运行项目,或者在项目具有这些要求时在启动时运行项目。

接下来,在第 2 章开始学习 Python 和 IoT中,我们将直接跳转到 Python 和电子产品,并创建一个端到端启用互联网的程序,可以通过互联网控制 LED。在使用在线服务dweet.io将 LED 连接到互联网之前,我们将研究使用 GPIOZero 和 PiGPIO 库闪烁 LED 的两种可选方式。

问题

最后,以下是一系列问题,供您测试有关本章内容的知识。您可以在本书的评估部分找到答案:

  1. 您应该始终为 Python 项目使用虚拟环境的主要原因是什么?
  2. 您是否需要或应该将虚拟环境文件夹(即,venv)置于版本控制之下?
  3. 为什么要创建一个requirements.txt文件?
  4. 您需要以 root 用户身份运行 Python 脚本。您必须采取什么步骤来确保脚本在其预期的虚拟环境上下文中执行?
  5. source venv/bin/activate命令做什么?
  6. 您处于激活的虚拟环境中。离开虚拟环境并返回到主机 shell 的命令是什么?
  7. 您在 PyCharm 中创建了一个 Python 项目和虚拟环境。您能否在终端中处理并运行项目的 Python 脚本?
  8. 您需要一个 GUI 工具在 Raspberry Pi 上编辑和测试 Python 代码,但没有安装 PyCharm。您可以使用 Python 和 Raspbian 附带的预装工具吗?
  9. 您的 Python 和电子学知识已经有所提高,正在尝试使用 I2C 将设备连接到 Raspberry Pi,但您无法让它工作。可能存在什么问题?您如何解决?

进一步阅读

本章介绍了venv虚拟环境工具。以下是其官方文件的链接:

如果您想了解virtualenvpipenv替代虚拟环境工具,请参阅其官方文档:

以下是指向Python 打包指南的链接。在这里,您可以找到有关 Python 包管理的全面指南,包括pip和简易安装/设置工具:

如果您希望了解有关调度和 cron 的更多信息,请参阅以下两个资源: