Python 包(Packages)
2023-09-17 22:16:40
我们根据某些标准在不同的文件夹和子文件夹中组织大量文件,以便我们可以轻松查找和管理它们。 同样,Python 中的包将模块化方法的概念提升到下一个逻辑级别。 如您所知,一个module可以包含多个对象,例如类、函数等。 包可以包含一个或多个相关模块。从物理上讲,包实际上是一个包含一个或多个模块文件的文件夹。
让我们使用以下步骤创建一个名为 mypackage 的包:
- 创建一个名为
D:MyApp
的新文件夹。 - 在
MyApp
中,创建一个名为"mypackage"的子文件夹。 - 在 mypackage 文件夹中创建一个空的
__init__.py
文件。 - 使用像 IDLE 这样的 Python 感知编辑器,使用以下代码创建模块 greet.py 和 functions.py:
greet.py
def SayHello(name):
print("Hello ", name)
functions.py
def sum(x,y):
return x+y
def average(x,y):
return (x+y)/2
def power(x,y):
return x**y
就是这样。我们创建了名为mypackage的软件包。以下是文件夹结构:
包文件夹结构
从包导入模块(Importing a Module from a Package)
现在,要测试我们的包,请将命令提示符导航到 MyApp
文件夹并从那里调用 Python 提示符。
D:MyApp>python
从 mypackage 包导入函数模块并调用其 power() 函数。
>>> from mypackage import functions
>>> functions.power(3,2)
9
也可以从包中的模块导入特定功能。
>>> from mypackage.functions import sum
>>> sum(10,20)
30
>>> average(10,12)
Traceback (most recent call last):
File "<pyshell#13>", line 1, in <module>
NameError: name 'average' is not defined
__init__.py
包文件夹包含一个名为 __init__.py
的特殊文件,用于存储包的内容。它有两个目的:
- Python 解释器将文件夹识别为包(如果它包含
__init__.py
文件)。 __init__.py
公开要导入的模块中的指定资源。
空的__init__.py
文件使上述模块中的所有函数在导入此包时可用。请注意,__init__.py
对于 Python 将文件夹识别为包至关重要。您可以选择从各个模块中定义要可用的函数。
注意: 我们还将在 MyApp
文件夹中创建另一个 Python 脚本,并在其中导入 mypackage 包。 它应与要导入的包处于同一级别。
__init__.py
文件通常为空。但是,它也可用于从包文件夹中的模块中选择特定功能,并使它们可供导入。修改__init__.py
如下:
__init__.py
from .functions import average, power
from .greet import SayHello
现在可以在解释器会话或其他可执行脚本中导入指定的函数。
在MyApp
文件夹中创建test.py
以测试 mypackage。
test.py
from mypackage import power, average, SayHello
SayHello()
x=power(3,2)
print("power(3,2) : ", x)
请注意,函数power()
和SayHello()
是从包中导入的,而不是像前面那样从它们各自的模块导入的。上述脚本的输出为:
D:MyApp>python test.py
Hello world
power(3,2) : 9
全局安装包(Install a Package Globally)
创建包后,可以通过运行安装脚本来安装该包以供系统范围使用。该脚本从setuptools
模块调用setup()
函数。
让我们通过运行安装脚本来安装 mypackage 以供系统范围使用。
将以下代码保存为父文件夹 MyApp
中的 setup.py。该脚本从安装工具模块调用setup()
函数。setup()
函数采用各种参数,例如名称、版本、作者、依赖项列表等。zip_safe
参数定义包是在压缩模式下还是在常规模式下安装。
示例: setup.py
from setuptools import setup
setup(name='mypackage',
version='0.1',
description='Testing installation of Package',
url='#',
author='auth',
author_email='[email protected]',
license='MIT',
packages=['mypackage'],
zip_safe=False)
现在执行以下命令以使用 pip 实用程序安装mypackage
。 确保命令提示符位于父文件夹中,在本例中为 D:MyApp
。
D:MyApp>pip install mypackage
Processing d:MyApp
Installing collected packages: mypack
Running setup.py install for mypack ... done
Successfully installed mypackage-0.1
现在 mypackage 可供系统范围使用,并且可以在任何脚本或解释器中导入。
D:>python
>>> import mypackage
>>>mypackage.average(10,20)
15.0
>>>mypackage.power(10,2)
100
您可能还希望发布包以供公众使用。 PyPI(代表Python Package Index)是Python包的存储库。 请访问https://packaging.python.org/distributing以了解有关将包上传到 PyPI 的过程的更多信息。
本文内容总结: