如何在 Python 3 中编写模块

介绍

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

有些模块通过Python标准库(https://docs.python.org/3/library/)可用,因此与您的Python安装一起安装。其他模块可以通过Python的包管理器(https://andsky.com/tech/tutorials/how-to-import-modules-in-python-3#checking-for-and-installing-modules)安装。

本教程将指导您通过编写Python模块,用于其他编程文件。

前提条件

如果您没有设置编程环境,您可以参考本地编程环境的安装和安装指南(https://www.digitalocean.com/community/tutorial_series/how-to-install-and-set-up-a-local-programming-environment-for-python-3)或适用于您的操作系统(Ubuntu, CentOS, Debian 等)的编程环境(https://www.digitalocean.com/community/tutorial_collections/how-to-install-python-3-and-set-up-a-programming-environment)。

编写和导入模块

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

<$>[info] 信息: 要跟进本教程中的示例代码,请在本地系统上运行python3命令,打开Python交互壳。

从我们的Python 3本地编程环境或基于服务器的编程环境中,让我们先创建一个hello.py文件,然后将其导入到另一个文件中。

首先,我们将创建一个函数(https://andsky.com/tech/tutorials/how-to-define-functions-in-python-3),打印你好,世界!:

1[label hello.py]
2# Define a function
3def world():
4    print("Hello, World!")

如果我们在python hello.py的命令行上运行该程序,就不会发生任何事情,因为我们没有告诉该程序做任何事情。

让我们在同一个目录中创建一个名为main_program.py的第二个文件,这样我们就可以 导入我们刚刚创建的模块,然后调用该函数。

1[label main_program.py]
2# Import hello module
3import hello
4
5# Call function
6hello.world()

由于我们正在 导入一个模块,我们需要通过点符号引用模块名称来调用该函数。

相反,我们可以将模块导入为从问候导入世界,并将该函数直接命名为world()

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

1python main_program.py

当我们这样做时,我们将收到以下输出:

1[secondary_label Output]
2Hello, World!

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

1[label hello.py]
2# Define a function
3def world():
4    print("Hello, World!")
5
6# Define a variable
7shark = "Sammy"

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

1[label main_program.py]
2# Import hello module
3import hello
4
5# Call function
6hello.world()
7
8# Print variable
9print(hello.shark)

一旦我们重新运行该程序,我们将收到以下输出:

1[secondary_label Output]
2Hello, World!
3Sammy

最后,让我们在hello.py文件中创建一个Octopus类,具有名称颜色属性,以及一个函数,在调用时将属性打印出来。

 1[label hello.py]
 2# Define a function
 3def world():
 4    print("Hello, World!")
 5
 6# Define a variable
 7shark = "Sammy"
 8
 9# Define a class
10class Octopus:
11    def __init__(self, name, color):
12        self.color = color
13        self.name = name
14
15    def tell_me_about_the_octopus(self):
16        print("This octopus is " + self.color + ".")
17        print(self.name + " is the octopus's name.")

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

 1[label main_program.py]
 2# Import hello module
 3import hello
 4
 5# Call function
 6hello.world()
 7
 8# Print variable
 9print(hello.shark)
10
11# Call class
12jesse = hello.Octopus("Jesse", "orange")
13jesse.tell_me_about_the_octopus()

一旦我们用hello.Octopus()调用了Octopus类,我们就可以在main_program.py文件的名称空间中访问该类的函数和属性,这样我们就可以在最后一行上写jesse.tell_me_about_the_octopus()而不会调用hello

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

1[secondary_label Output]
2Hello, World!
3Sammy
4This octopus is orange.
5Jesse is the octopus's name.

重要的是要记住,虽然模块通常是定义,但它们也可以实现代码. 要了解这是如何工作的,让我们重写我们的 hello.py 文件,以实现 world() 函数:

1[label hello.py]
2# Define a function
3def world():
4    print("Hello, World!")
5
6# Call function within module
7world()

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

现在,在我们的main_program.py文件中,我们将删除除导入陈述的每个行:

1[label main_program.py]
2# Import hello module
3import hello

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

1[secondary_label Output]
2Hello, World!

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

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

从另一个目录访问模块

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

如果您想从主程序所在的相同目录以外的位置使用 Python 模块,您有几个选项。

附带路径

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

要将模块的路径附加到另一个编程文件中,您将开始通过在主程序文件中使用的任何其他模块旁边导入sys模块。

sys模块是Python标准库的一部分,提供系统特定的参数和功能,您可以在程序中使用,以设置您想要实现的模块的路径。

例如,假设我们移动了hello.py文件,现在它位于路径/usr/sammy/,而main_program.py文件则位于另一个目录中。

在我们的main_program.py文件中,我们仍然可以通过导入sys模块导入hello模块,然后将/usr/sammy/附加到Python检查文件的路径中。

1[label main_program.py]
2import sys
3sys.path.append('/usr/sammy/')
4
5import hello
6...

只要正确设置hello.py文件的路径,您将能够在没有任何错误的情况下运行main_program.py文件,并收到与hello.py在同一目录时相同的输出。

将模块添加到 Python 路径

您需要的第二种选择是将模块添加到Python检查模块和包的路径中,这是一个更永久的解决方案,使该模块可用于整个环境或整个系统,从而使这种方法更便携式。

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

1python3

接下来,导入sys模块:

1import sys

然后让Python打印出系统路径:

1print(sys.path)

在这里,你会收到一些输出,至少有一个系统路径. 如果你在一个编程环境中,你可能会收到几种。你会想要寻找在你目前使用的环境中的一种,但你也可能想将模块添加到你的主要系统Python路径。

1[secondary_label Output]
2'/usr/sammy/my_env/lib/python3.5/site-packages'

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

1[label main_program.py]
2import hello
3...

当你运行你的程序,它应该完成没有错误。

修改模块的路径可以确保您可以访问该模块,无论您在哪个目录中,这尤其有用,如果您有多个项目参考某个特定模块。

结论

写一个Python模块就像写任何其他Python .py文件一样。本教程涵盖了如何在一个模块内写定义,在另一个Python编程文件中使用这些定义,并讨论了如何保留模块以便访问它。

您可以通过阅读 如何在Python 中导入模块 3来了解有关安装和导入模块的更多信息。

Published At
Categories with 技术
comments powered by Disqus