Python Zip 导入:快速分发模块和包

举报
Yuchuan 发表于 2021/12/29 20:40:06 2021/12/29
【摘要】 如果 ZIP 文件在模块搜索路径中可用,Python 可以直接从 ZIP 文件导入代码。此功能称为Zip 导入。您可以利用 Zip 导入将模块和包捆绑到单个存档中,以便您可以快速有效地将它们分发给最终用户。 如果您经常将 Python 代码捆绑到 ZIP 文件中并且需要在日常任务中使用该代码,您还可以利用 Zip 导入。

目录

Python 允许您直接通过Zip导入从 ZIP 文件导入代码。这个有趣的内置功能使您可以压缩 Python 代码以进行分发。如果您经常使用 ZIP 文件中的 Python 代码,Zip 导入也会有所帮助。无论哪种情况,学习创建可导入的 ZIP 文件并从中导入代码都是一项宝贵的技能。

即使您的日常工作流不涉及包含 Python 代码的 ZIP 文件,您仍将通过本教程探索 Zip 导入来学习一些有趣和有趣的新技能。

在本教程中,您将学习:

  • 什么是Zip 导入
  • 何时在代码中使用 Zip 导入
  • 如何创建导入的ZIP文件zipfile
  • 如何使您的 ZIP 文件可用于从中导入代码

您还将学习如何使用该zipimport模块从 ZIP 文件中动态导入代码,而无需将它们添加到 Python 的模块搜索路径中。为此,您将编写一个从 ZIP 文件加载 Python 代码的最小插件系统。

要从本教程中获得最大收益,您应该事先了解 Python 的导入系统的工作原理。您还应该了解使用 操作 ZIP 文件zipfile处理文件和使用with语句的基础知识。

了解 Python Zip 导入

从 Python 2.3 开始,您可以从ZIP 文件中导入模块和包。此功能称为Zip 导入,当您需要将完整包作为单个文件分发时非常有用,这是其最常见的用例。

PEP 273引入了 Zip 导入作为内置功能。Python社区中的功能被广泛接受为一个必须具备的,因为分配几个独立的.py.pyc.pyo文件并不总是恰当的和有效的。

Zip 导入可以简化共享和分发代码的过程,这样您的同事和最终用户就不必费力地尝试将文件提取到正确的位置以使代码正常工作。

注意:Python 3.5 开始.pyo不再使用文件扩展名。有关详细信息,请参阅PEP 488

PEP 302添加了一系列导入钩子,为 Zip 导入提供内置支持。如果您想从 ZIP 文件中导入模块和包,那么您只需要该文件出现在 Python 的模块搜索路径中即可

模块搜索路径是目录和 ZIP 文件的列表。它住在sys.path. 当您import在代码中运行语句时,Python 会自动搜索此列表中的项目。

在以下部分中,您将学习如何使用不同的 Python 工具和技术创建随时可以导入的 ZIP 文件。您还将了解将这些文件添加到当前 Python 模块搜索路径的几种方法。最后,您将深入研究zipimport在幕后支持 Zip 导入功能的模块。

创建您自己的可导入 ZIP 文件

Zip 导入允许您将跨多个模块和包组织为单个文件的代码快速分发。在创建可导入的 ZIP 文件时,Python 已经涵盖了您。标准库中zipfile模块包括一个用于操作 ZIP 文件的类。它还包括一个名为 的更专业的类,它有助于创建可导入的 ZIP 文件。ZipFilePyZipFile

PyZipFile让您可以快速有效地将 Python 代码打包到 ZIP 文件中。该类继承自ZipFile,因此共享相同的基接口。但是,这些类之间有两个主要区别:

  1. 的初始值设定项PyZipFile采用名为 的可选参数optimize,它允许您通过在存档之前将其编译为字节码来优化 Python 代码。
  2. PyZipFile类提供一个调用的方法.writepy(),它接受一个Python模块或包作为参数,并把它添加到一个目标ZIP文件。

如果optimize-1,它的默认值,则输入.py文件会自动编译为.pyc文件,然后添加到目标存档。为什么会发生这种情况?通过跳过编译步骤,打包.pyc文件而不是原始.py文件使导入过程更加高效。您将在接下来的部分中了解有关此主题的更多信息。

在以下两节中,您将动手并开始创建自己的包含模块和包的可导入 ZIP 文件。

将 Python 模块捆绑到 ZIP 文件中

在本节中,您将使用PyZipFile.writepy().py文件编译为字节码并将生成的.pyc文件添加到 ZIP 存档中。尝试.writepy()一下,假设你有一个hello.py模块:

"""Print a greeting message."""
# hello.py

def greet(name="World"):
    print(f"Hello, {name}! Welcome to Real Python!")

该模块定义了一个被调用的函数greet(),该函数接受name一个参数并将友好的问候信息打印到屏幕上。

现在假设您要将这个模块打包成一个 ZIP 文件,您可以稍后导入。为此,您可以运行以下代码:

>>>
>>> import zipfile

>>> with zipfile.PyZipFile("hello.zip", mode="w") as zip_module:
...     zip_module.writepy("hello.py")
...

>>> with zipfile.PyZipFile("hello.zip", mode="r") as zip_module:
...     zip_module.printdir()
...
File Name                                             Modified             Size
hello.pyc                                      2021-10-18 05:40:04          313

运行此代码后,您将hello.zip在当前工作目录中拥有一个文件。要将呼叫.writepy()zip_module自动编译hello.pyhello.pyc并将其存储在底层的ZIP文件,hello.zip。这就是.printdir()显示hello.pyc而不是原始hello.py文件的原因。这种自动编译可确保高效的导入过程。

注意:PyZipFile默认情况下,该类不会压缩您的 Python 模块和包。它只是将它们存储在一个 ZIP 文件容器中。如果你想挤进你的源文件,您需要通过明确提供的压缩方法compression的参数PyZipFile。目前,Python 支持Deflatebzip2LZMA压缩方法。

在本教程中,你会依靠的默认值compressionZIP_STORED这意味着你的源文件不会被压缩。压缩源文件可能会影响导入操作的性能,您将在本教程后面了解到。

您也可以手工打包.py,并.pyc通过使用任何常规文件成ZIP文件的文件归档。如果生成的存档包含.py没有相应.pyc文件的文件,则 Python 将在您第一次从该特定 ZIP 文件导入时编译它们。

Python 不会修改底层 ZIP 文件来添加新编译的.pyc文件。因此,下次运行导入时,Python 将再次编译代码。此行为会使导入过程变慢。

您还可以将目录作为第一个参数传递给.writepy(). 如果输入目录不是 Python 包,则该方法会扫描其中的.py文件,将它们编译为.pyc文件,并将这些.pyc文件添加到目标 ZIP 文件的顶层。扫描步骤不是递归的,这意味着不会扫描子目录中的源文件。

您可以通过将optimize参数设置PyZipFile为以下值之一来进一步调整编译过程:

Value Optimizations
0 不执行任何优化
1 删除assert语句
2 删除assert语句和文档字符串

使用这些值,您可以在.writepy().py文件编译为.pyc文件之前微调要使用的优化级别。

到目前为止,您已经学习了如何将一个或多个模块捆绑到一个 ZIP 文件中。在您的日常编码中,您可能还需要压缩一个完整的 Python 包。您将在下一节中了解如何执行此操作。

将 Python 包捆绑到 ZIP 文件中

您还可以使用PyZipFile及其.writepy()方法将Python 包捆绑到 ZIP 文件中。正如您已经了解到的,如果您将常规目录作为第一个参数传递给.writepy(),则该方法会扫描目录中的.py文件,编译它们,并将相应的.pyc文件添加到生成的 ZIP 文件中。

另一方面,如果输入目录是 Python 包,则.writepy()编译所有.py文件并将它们添加到 ZIP 文件中,保持包的内部结构。

要尝试.writepy()使用 Python 包,请创建一个新hello/目录并将您的hello.py文件复制到其中。然后添加一个空__init__.py模块,将目录变成一个包。您应该最终得到以下结构:

hello/
|
├── __init__.py
└── hello.py

现在假设您想将此包捆绑到一个 ZIP 文件中以进行分发。如果是这种情况,那么您可以运行以下代码:

>>>
>>> import zipfile

>>> with zipfile.PyZipFile("hello_pkg.zip", mode="w") as zip_pkg:
...     zip_pkg.writepy("hello")
...

>>> with zipfile.PyZipFile("hello_pkg.zip", mode="r") as zip_pkg:
...     zip_pkg.printdir()
...
File Name                                             Modified             Size
hello/__init__.pyc                             2021-10-18 05:56:00          110
hello/hello.pyc                                2021-10-18 05:56:00          319

调用.writepy()hello包作为参数,在其中搜索.py文件,将它们编译为.pyc文件,最后将它们添加到目标 ZIP 文件中,保持相同的包结构。

了解 Zip 导入的限制

当您使用 ZIP 文件分发 Python 代码时,您需要考虑 Zip 导入的一些限制:

  • 加载动态文件,如.pyd.dll.so是不可能的
  • .py文件中导入代码意味着性能上的妥协
  • 如果解压库不可用,从压缩文件导入代码将失败。

您可以在 ZIP 存档中包含任何类型的文件。然而,当用户免受这些存档导入代码,只有.py.pyw.pyc,和.pyo文件读取。从动态文件,如导入代码.pyd.dll.so,如果他们生活在一个ZIP文件是不可能的。例如,您无法从 ZIP 存档加载用C编写的共享库和扩展模块。

您可以通过从 ZIP 文件中提取动态模块,将它们写入文件系统,然后加载它们的代码来解决此限制。但是,这意味着您需要创建临时文件并处理可能的错误和安全风险,这会使事情变得复杂。

正如您在本教程前面学到的那样,Zip 导入也可能意味着性能妥协。如果您的存档包含.py模块,那么 Python 将编译它们以满足导入。但是,它不会保存相应的.pyc文件。此行为可能会降低导入操作的性能。

最后,如果您需要从压缩的 ZIP 文件中导入代码,则zlib必须在您的工作环境中用于解压。zlib如果此库不可用,则从压缩档案中导入代码将失败并显示丢失消息。此外,解压步骤为导入过程增加了额外的性能开销。由于这些原因,您将在本教程中使用未压缩的 ZIP 文件。

从 ZIP 文件导入 Python 代码

到目前为止,您已经学习了如何创建自己的可导入 ZIP 文件以进行分发。现在假设您在另一端,并且您正在获取带有 Python 模块和包的 ZIP 文件。你怎么能从他们那里导入代码?在本节中,您将获得此问题的答案,并了解如何使 ZIP 文件可用于导入其内容。

要让 Python 从 ZIP 文件中导入代码,该文件必须在 Python 的模块搜索路径中可用,该路径存储在 .zip 文件中sys.path。此模块级变量包含指定模块搜索路径的字符串列表。内容包括:path

  • 包含您正在运行的脚本的目录
  • 当前目录,如果您以交互方式运行解释器
  • PYTHONPATH环境变量中的目录(如果已设置)
  • 取决于您的特定 Python 安装的目录列表
  • 任何路径中列出的目录配置文件(.pth文件)

下表指出了将 ZIP 文件添加到 的几种方法sys.path

Option 目标代码或解释器
The list.insert(), list.append(), and list.extend() methods 您正在编写和运行的 Python 代码
The PYTHONPATH environment variable 您在系统上运行的每个 Python 解释器
A Python path configuration file, or .pth files 包含.pth文件的 Python 解释器

在以下部分中,您将探索这三种添加项目的方法,sys.path以便您可以使 ZIP 文件可用于导入其内容。

使用sys.path动态的邮编进口

因为sys.path是一个list对象,所以您可以使用常规list方法从 Python 代码中操作它。在一般情况下,新的项目添加到一个list对象,你可以使用.insert().append().extend()

通常,您将使用从 Python 代码中.insert(0, item)添加新项目sys.path。调用.insert()这种方式会item在列表的开头插入,确保新添加的项目优先于现有项目。在可能发生名称冲突时item,使用开头使您能够隐藏现有模块和包。

现在假设您需要将hello.zip包含hello.py模块的文件添加到当前 Python 的sys.path. 在这种情况下,您可以运行以下示例中的代码。请注意,要在您的计算机上运行此示例,您需要提供正确的路径hello.zip

>>>
>>> import sys

>>> # Insert the hello.zip into sys.path
>>> sys.path.insert(0, "/path/to/hello.zip")

>>> sys.path[0]
'/path/to/hello.zip'

>>> # Import and use the code
>>> import hello

>>> hello.greet("Pythonista")
Hello, Pythonista! Welcome to Real Python!

将路径添加到hello.zipsys.path,您就可以hello.py像使用任何常规模块一样从中导入对象。

如果像 一样hello_pkg.zip,您的 ZIP 文件包含一个 Python 包,那么您也可以将其添加到sys.path。在这种情况下,导入应该是包相关的:

>>>
>>> import sys

>>> sys.path.insert(0, "/path/to/hello_pkg.zip")

>>> from hello import hello

>>> hello.greet("Pythonista")
Hello, Pythonista! Welcome to Real Python!

因为你的代码现在在一个包中,你需要hellohello包中导入模块。然后您可以greet()像往常一样访问该功能。

添加项目的另一种选择sys.path是使用.append(). 此方法将单个对象作为参数并将其添加到基础列表的末尾。重新启动 Python 交互式会话并运行提供以下路径的代码hello.zip

>>>
>>> import sys

>>> sys.path.append("/path/to/hello.zip")

>>> # The hello.zip file is at the end of sys.path
>>> sys.path[-1]
'/path/to/hello.zip'

>>> from hello import greet
>>> greet("Pythonista")
Hello, Pythonista! Welcome to Real Python!

这种技术的工作原理类似于使用.insert(). 但是,ZIP 文件的路径现在位于sys.path. 如果列表中的任何前面的项目包含名为 的模块hello.py,则 Python 将从该模块而不是从您新添加的hello.py模块导入。

您还可以.append()在循环中使用将多个文件添加到sys.path,或者您可以只使用.extend(). 此方法采用可迭代的项目并将其内容添加到基础列表的末尾。与 一样.append(),请记住,这.extend()会将您的文件添加到 的末尾sys.path,因此现有名称可以隐藏 ZIP 文件中的模块和包。

使用PYTHONPATH全系统邮编进口

在某些情况下,您可能需要一个给定的 ZIP 文件,以便从您在计算机上运行的任何脚本或程序中导入其内容。在这些情况下,您可以使用PYTHONPATH环境变量让 Pythonsys.path在您运行解释器时自动加载您的存档。

PYTHONPATH使用与PATH环境变量相同的格式,由os.pathsep. 在Unix系统上,例如 Linux 和 macOS,此函数返回一个冒号 ( :),而在 Windows 上,它返回一个分号 ( ;)。

例如,如果您使用的是 Linux 或 macOS,则可以通过运行以下命令将hello.zip文件添加到PYTHONPATH

$ export PYTHONPATH="$PYTHONPATH:/path/to/hello.zip"

此命令添加/path/to/hello.zip到您的当前PYTHONPATH并导出它,以便它在当前终端会话中可用。

注意:上面的命令会导出一个自定义版本,PYTHONPATH其中包含hello.zip. 此自定义版本的变量仅在您当前的命令行会话中可用,并且在您关闭会话后将丢失。

如果您将Bash作为当前的shell运行,那么您可以PYTHONPATH通过将以下代码添加到您的.bashrc文件中,使此自定义版本可用于您的所有命令行会话:

# .bashrc

if [ -f /path/to/hello.zip ]; then
    export PYTHONPATH="$PYTHONPATH:/path/to/hello.zip"
fi

此代码检查hello.zip您的文件系统上是否存在。如果是,那么它将文件添加到PYTHONPATH变量中并导出它。因为每次启动新的命令行实例时,Bash 都会运行这个文件,所以自定义PYTHONPATH将在每个会话中可用。

现在您可以发出python命令来运行解释器。到了那里后,sys.path照常检查以下内容:

>>>
>>> import sys

>>> sys.path
[..., '/path/to/hello.zip', ...]

凉爽的!您的hello.zip文件在列表中。从现在开始,您将能够hello.py像在上一节中所做的那样从中导入对象。来试试看吧!

在上述输出中需要注意的重要一点是,您的hello.zip文件不在 的开头sys.path,这意味着hello根据 Python 处理其模块 seach path 的方式,较早出现的同名模块将优先于您的模块。

PYTHONPATH在 Windows 系统上添加项目,您可以在cmd.exe窗口中执行命令:

C:\> set PYTHONPATH=%PYTHONPATH%;C:\path\to\hello.zip

此命令添加C:\path\to\hello.zipPYTHONPATHWindows 计算机上变量的当前内容。要检查它,请在同一个命令提示符会话中运行 Python 解释器,sys.path并像以前一样查看 的内容。

注意:同样,PYTHONPATH您使用上述命令设置的变量将仅在您当前的终端会话中可用。要PYTHONPATH在 Windows 上永久设置变量,请了解如何在 Windows 中添加到 PYTHONPATH

将目录和 ZIP 文件添加到PYTHONPATH环境变量使这些条目可用于您在手头的终端会话下运行的任何 Python 解释器。最后,重要的是要注意 Python 会默默地忽略 中列出的不存在的目录和 ZIP 文件PYTHONPATH,因此请注意这一点。

使用.pth文件进行解释器范围的 Zip 导入

有时,您可能只想在运行特定的 Python 解释器时从给定的 ZIP 文件中导入代码。当您的项目使用该 ZIP 文件中的代码并且您不希望该代码可用于您的其余项目时,这很有用。

Python 的路径配置文件允许您sys.path使用自定义目录和 ZIP 文件扩展给定解释器的路径

路径配置文件使用.pth文件扩展名,可以保存目录和 ZIP 文件的路径列表,每行一个。sys.path每次运行提供.pth文件的 Python 解释器时,都会添加此路径列表。

Python 的.pth文件有一个简单的格式:

  • 每行必须包含一个路径条目。
  • 空白行和以数字符号 ( #)开头的行将被跳过。
  • 以 开头的行import被执行。

有了合适的.pth文件后,您需要将其复制到站点目录之一,以便 Python 可以找到它并加载其内容。要获取当前 Python 环境的站点目录,您可以getusersitepackages()site模块调用。如果您在当前机器上没有管理员权限,那么您可以使用用户站点目录site.USER_SITE.

注意:您的主文件夹中可能不存在用户站点目录。如果这是您的情况,那么请按照所需的路径结构随意创建它。

例如,以下命令hello.pth在 Ubuntu 上为系统范围的 Python 3 解释器创建一个路径配置文件:

$ sudo nano /usr/lib/python3/dist-packages/hello.pth

此命令hello.pth使用GNU nano文本编辑器创建root. 在那里,输入hello.zip文件的路径。按Ctrl+X,然后Y,最后保存文件Enter。现在,sys.path当您再次启动系统 Python 解释器时,此 ZIP 文件将可用:

>>>
>>> import sys

>>> sys.path
[..., '/path/to/hello.zip', ...]

而已!从现在开始,hello.py只要您使用系统范围的 Python 解释器,就可以从中导入对象。

同样,sys.path当 Python 读取和加载给定.pth文件的内容时,不会添加不存在的目录和 ZIP文件。最后,.pth文件中的重复条目仅添加到sys.path.

探索 Python zipimport:Zip 导入背后的工具

您已经在zipimport不知不觉中使用了标准库中的模块。在幕后,当sys.path项目包含 ZIP 文件的路径时,Python 的内置导入机制会自动使用此模块。在本节中,您将zipimport通过一个实际示例了解其工作原理以及如何在代码中显式使用它。

了解基础知识 zipimport

的主要成分zipimportzipimporter。此类将 ZIP 文件的路径作为参数并创建导入器实例。下面是一个如何使用的例子zipimporter以及它的一些属性和方法:

>>>
>>> from zipimport import zipimporter

>>> importer = zipimporter("/path/to/hello.zip")

>>> importer.is_package("hello")
False

>>> importer.get_filename("hello")
'/path/to/hello.zip/hello.pyc'

>>> hello = importer.load_module("hello")
>>> hello.__file__
'/path/to/hello.zip/hello.pyc'

>>> hello.greet("Pythonista")
Hello, Pythonista! Welcome to Real Python!

在本例中,您首先zipimporterzipimport. 然后zipimporter使用hello.zip文件路径创建一个实例。

zipimporter类提供了一些有用的属性和方法。例如,如果输入名称是包,则.is_package()返回TrueFalse否则返回。该.get_filename()方法返回.__file__存档内给定模块的路径 ( )。

如果要将模块的名称带入当前命名空间,则可以使用.load_module(),它返回对输入模块的引用。通过该引用,您可以像往常一样访问模块中的任何代码对象

构建插件系统 zipimport

正如您在上面了解到的,Python 在内部使用zipimport从 ZIP 文件加载代码。您还了解到该模块提供了可在某些实际编码情况下使用的工具。例如,假设您要实现一个自定义插件系统,其中每个插件都位于自己的 ZIP 文件中。您的代码应该在给定文件夹中搜索 ZIP 文件并自动导入插件的功能。

要实际体验这个示例,您将实现两个玩具插件,它们接收一条消息和一个标题,并将它们显示在您的默认 Web 浏览器和Tkinter消息框中。每个插件都应该位于自己的目录中,在一个名为plugin.py. 这个模块应该实现插件的功能并提供一个main()函数作为插件的入口点。

继续并创建一个文件夹,web_message/其中包含一个plugin.py文件。在您喜欢的代码编辑器或 IDE 中打开该文件,然后为 Web 浏览器插件键入以下代码:

"""A plugin that displays a message using webbrowser."""
# web_message/plugin.py

import tempfile
import webbrowser

def main(text, title="Alert"):
    with tempfile.NamedTemporaryFile(
        mode="w", suffix=".html", delete=False
    ) as home:
        html = f"""
            <html>
                <head>
                    <title>{title}</title>
                </head>
                <body>
                    <h1>
                        {text}
                    </h1>
                </body>
            </html>
        """
        home.write(html)
        path = "file://" + home.name
    webbrowser.open(path)

main()此代码中的函数接受一条text消息和一个窗口title。然后它NamedTemporaryFilewith语句中创建一个。该文件将包含一个最小的HTML文档显示title,并text在网页上。要在默认 Web 浏览器中打开此文件,请使用webbrowser.open().

下一个插件提供了类似的功能,但使用了Tkinter工具包。这个插件的代码也应该存在于一个名为plugin.py. 您可以将模块放在tk_message/文件系统中调用的目录中:

"""A plugin that displays a message using Tkinter."""
# tk_message/plugin.py

import tkinter
from tkinter import messagebox

def main(text, title="Alert"):
    root = tkinter.Tk()
    root.withdraw()
    messagebox.showinfo(title, text)

遵循与 Web 浏览器插件相同的模式,main()texttitle. 在这种情况下,该函数会创建一个Tk实例来保存插件的顶级窗口。但是,您不需要显示该窗口,只需要显示一个消息框。因此,您可以使用.withdraw()隐藏根窗口,然后调用.showinfo()messagebox显示与输入的对话texttitle

现在您需要将每个插件打包成自己的 ZIP 文件。为此,请在包含和文件夹的目录中启动 Python交互式会话并运行以下代码:web_message/tk_message/

>>>
>>> import zipfile

>>> plugins = ("web_message", "tk_message")

>>> for plugin in plugins:
...     with zipfile.PyZipFile(f"{plugin}.zip", mode="w") as zip_plugin:
...         zip_plugin.writepy(plugin)
...

下一步是为您的插件系统创建一个根文件夹。此文件夹必须包含一个plugins/目录,其中包含新创建的 ZIP 文件。以下是您的目录的外观:

rp_plugins/
│
├── plugins/
│   │
│   ├── tk_message.zip
│   └── web_message.zip
│
└── main.py

在 中main.py,您将放置插件系统的客户端代码。继续并填充main.py以下代码:

 1# main.py
 2
 3import zipimport
 4from pathlib import Path
 5
 6def load_plugins(path):
 7    plugins = []
 8    for zip_plugin in path.glob("*.zip"):
 9        importer = zipimport.zipimporter(zip_plugin)
10        plugin_module = importer.load_module("plugin")
11        plugins.append(getattr(plugin_module, "main"))
12    return plugins
13
14if __name__ == "__main__":
15    path = Path("plugins/")
16    plugins = load_plugins(path)
17    for plugin in plugins:
18        plugin("Hello, World!", "Greeting!")

以下是此代码的逐行工作方式:

  • 第 3 行导入zipimport以从相应的 ZIP 文件动态加载您的插件。
  • 第 4 行导入pathlib以管理系统路径。
  • 第 6 行定义了load_plugins(),它采用包含插件档案的目录的路径。
  • 第 7 行创建一个空列表来保存当前插件。
  • 第 8 行定义了一个for循环,它遍历.zipplugins 目录中的文件。
  • 第 9 行为zipimporter系统中的每个插件创建一个实例。
  • 第 10 行plugin从每个插件 ZIP 文件加载模块。
  • 第 11行将每个插件的main()功能附加到plugins列表中。
  • 12号线 返回plugins列表给调用者。

第 14 到 18 行调用load_plugins()生成可用插件的当前列表并在循环中执行它们。

如果您从命令行运行main.py脚本,那么您首先会看到一个 Tkinter 消息框,显示Hello, World!消息和Greeting!标题。关闭该窗口后,您的 Web 浏览器将在新页面上显示相同的消息和标题。来试试看吧!

结论

如果 ZIP 文件在模块搜索路径中可用,Python 可以直接从 ZIP 文件导入代码。此功能称为Zip 导入。您可以利用 Zip 导入将模块和包捆绑到单个存档中,以便您可以快速有效地将它们分发给最终用户。

如果您经常将 Python 代码捆绑到 ZIP 文件中并且需要在日常任务中使用该代码,您还可以利用 Zip 导入。

在本教程中,您学习了:

  • 什么是Zip 导入
  • 何时以及如何使用 Zip 导入
  • 如何构建导入的ZIP文件zipfile
  • 如何使 ZIP 文件可用于导入机制

您还编写了一个动手示例,说明如何使用zipimport. 通过这个示例,您学习了如何在 Python 中从 ZIP 文件中动态导入代码

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。