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 的特殊文件,用于存储包的内容。它有两个目的:

  1. Python 解释器将文件夹识别为包(如果它包含__init__.py文件)。
  2. __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 的过程的更多信息。

本文内容总结: