如何在 Python 3 中开发一个模块(module)

简介

Python 模块是由 Python 代码组成的 .py 文件。任何 Python 文件都可以被引用为模块。

一些模块可以通过 Python 标准库获得,因此它们会随着 Python 的安装而安装。其他模块可以通过 Python 的包管理器 pip 安装。此外,你也可以创建自己的 Python 模块,因为模块由 Python 的 .py 文件组成。

本教程将指导你编写 Python 模块,以便在其他编程文件中使用。

先决条件

你应该已经安装了 Python 3,并在计算机或服务器上设置了编程环境。如果你还没有设置编程环境,你可以参考本地编程环境或服务器编程环境的安装和设置指南,这些指南适用于你的操作系统(Ubuntu、CentOS、Debian 等)。

编写和导入模块

编写模块就像编写任何其他 Python 文件一样。模块可以包含函数、类和变量的定义,然后可以在其他 Python 程序中使用。

从我们的 Python 3 本地编程环境或基于服务器的编程环境开始,让我们首先创建一个名为 hello.py 的文件,稍后我们将在另一个文件中导入它。

首先,我们将创建一个打印 Hello, World! 的函数:

# 定义一个函数
def world():
    print("Hello, World!")

如果我们在命令行中使用 python hello.py 运行程序,什么也不会发生,因为我们还没有告诉程序要做什么。

让我们在相同的目录中创建一个名为 main_program.py 的第二个文件,以便我们可以导入刚刚创建的模块,然后调用该函数。这个文件需要在同一个目录中,这样 Python 才知道在哪里找到模块,因为它不是内置模块。

# 导入 hello 模块
import hello

# 调用函数
hello.world()

因为我们正在导入一个模块,所以我们需要通过点符号引用模块名称来调用函数。

我们也可以使用 from hello import world 导入模块,并直接调用 world() 函数。你可以通过阅读有关在导入模块时使用 fromimport 的方法来了解更多信息。

现在,我们可以在命令行中运行程序:

python main_program.py

当我们运行程序时,我们将收到以下输出:

Hello, World!

为了演示如何在模块中使用变量,让我们在 hello.py 文件中添加一个变量定义:

# 定义一个函数
def world():
    print("Hello, World!")

# 定义一个变量
shark = "Sammy"

接下来,我们将在我们的 main_program.py 文件中使用 print() 函数调用变量:

# 导入 hello 模块
import hello

# 调用函数
hello.world()

# 打印变量
print(hello.shark)

再次运行程序后,我们将收到以下输出:

Hello, World!
Sammy

最后,让我们在 hello.py 文件中定义一个类。我们将创建名为 Octopus 的类,具有 namecolor 属性,以及一个在调用时将打印属性的函数。

# 定义一个函数
def world():
    print("Hello, World!")

# 定义一个变量
shark = "Sammy"

# 定义一个类
class Octopus:
    def __init__(self, name, color):
        self.color = color
        self.name = name

    def tell_me_about_the_octopus(self):
        print("This octopus is " + self.color + ".")
        print(self.name + " is the octopus's name.")

现在,我们将在 main_program.py 文件的末尾添加这个类:

# 导入 hello 模块
import hello

# 调用函数
hello.world()

# 打印变量
print(hello.shark)

# 调用类
jesse = hello.Octopus("Jesse", "orange")
jesse.tell_me_about_the_octopus()

一旦我们使用 hello.Octopus() 调用了 Octopus 类,我们就可以在 main_program.py 文件的命名空间中访问类的函数和属性。这使我们可以在最后一行写 jesse.tell_me_about_the_octopus() 而不需要调用 hello。例如,我们也可以调用类的属性之一,比如 jesse.color,而不需要引用 hello 模块的名称。

当我们运行程序时,我们将收到以下输出:

Hello, World!
Sammy
This octopus is orange.
Jesse is the octopus's name.

重要的是要记住,尽管模块通常是定义,但它们也可以实现代码。为了演示这一点,让我们重写我们的 hello.py 文件,以便实现 world() 函数:

# 定义一个函数
def world():
    print("Hello, World!")

# 在模块内调用函数
world()

我们还删除了文件中的其他定义。

现在,在我们的 main_program.py 文件中,我们将删除除了导入语句之外的每一行:

# 导入 hello 模块
import hello

当我们运行 main_program.py 时,我们将收到以下输出:

Hello, World!

这是因为 hello 模块实现了 world() 函数,然后传递给 main_program.py,并在 main_program.py 运行时执行。

模块是由定义或代码组成的 Python 程序文件,你可以在其他 Python 程序文件中使用它们。

从另一个目录访问模块

模块可能对多个编程项目有用,在这种情况下,将模块保留在与特定项目相关联的特定目录中就没有太多意义。

如果你想从与主程序不同的位置使用 Python 模块,你有几个选项。

添加路径

一种选择是通过使用使用该模块的编程文件来调用模块的路径。这应该被视为一种在开发过程中可以执行的临时解决方案,因为它不会使模块在整个系统范围内可用。

要将模块的路径附加到另一个编程文件中,你将首先在主程序文件中导入 sys 模块以及你希望在程序中使用的任何其他模块。

sys 模块是 Python 标准库的一部分,它提供了系统特定的参数和函数,你可以在程序中使用它来设置你希望实现的模块的路径。

例如,假设我们将 hello.py 文件移动到路径 /usr/<^>sammy<^>/,而 main_program.py 文件位于另一个目录中。在我们的 main_program.py 文件中,我们仍然可以通过导入 sys 模块,然后将 /usr/<^>sammy<^>/ 附加到 Python 用于检查文件的路径中。

import sys
sys.path.append('/usr/sammy/')

import hello
...

只要你正确设置了 hello.py 文件的路径,你就可以在没有任何错误的情况下运行 main_program.py 文件,并收到与上述 hello.py 在同一目录中时相同的输出。

将模块添加到 Python 路径

你的第二个选择是将模块添加到 Python 用于检查模块和包的路径。这是一个更加永久的解决方案,使得模块在整个环境范围或系统范围内可用,使这种方法更具可移植性。

要找出 Python 检查的路径,从你的编程环境中运行 Python 解释器:

python3

接下来,导入 sys 模块:

>>)">import sys

然后让 Python 打印系统路径:

>>)">print(sys.path)

在这里,你将收到至少一个系统路径的一些输出。如果你在编程环境中,你可能会收到几个。你需要寻找当前使用的环境中的路径,但你可能还想将模块添加到你的主系统 Python 路径中。你要寻找的内容类似于:

'/usr/<^>sammy<^>/<^>my_env<^>/lib/python3.5/site-packages'

现在,你可以将 hello.py 文件移动到该目录中。完成后,你可以像往常一样导入 hello 模块:

import hello
...

当你运行程序时,它应该可以顺利完成。

修改模块的路径可以确保你可以访问模块,而不管你在哪个目录中。这在特别是当你有多个项目引用特定模块时非常有用。

结论

编写 Python 模块与编写任何其他 Python .py 文件相同。本教程涵盖了如何在模块中编写定义,在另一个 Python 编程文件中使用这些定义,并介绍了在哪里保留模块以便访问它的选项。