介绍
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来了解有关安装和导入模块的更多信息。