导入模块和检查 Python 版本
import subprocess
import sys
if sys.version_info[:2] >= (3, 8):
from importlib.metadata import PackageNotFoundError, version
else:
from importlib_metadata import PackageNotFoundError, version
这部分代码首先导入了 subprocess 和 sys 模块。subprocess 用于执行外部进程,而 sys 提供了访问与 Python 解释器紧密相关的变量和函数的接口。
接下来,它检查 Python 的版本。如果版本是 3.8 或更高,它将从 importlib.metadata 导入 PackageNotFoundError 和 version。如果是低于 3.8 的版本,它将从 importlib_metadata(一个第三方包)导入相同的类。这是为了保证代码在不同版本的 Python 中都能正常工作。
获取包版本
try:
dist_name = __name__
__version__ = version(dist_name)
except PackageNotFoundError:
__version__ = "unknown"
finally:
del version, PackageNotFoundError
这段代码尝试获取当前包的版本号。它通过 version(dist_name) 函数调用,其中 dist_name 通常是包的名称。
如果无法找到包(即 PackageNotFoundError 被触发),则将 version 设置为 "unknown"。
最后,它删除了 version 和 PackageNotFoundError 以清理命名空间。
从同一包中导入模块
总结
这个 init.py 文件为整个包设置了基础,确保了代码的兼容性,定义了包的版本,同时使包中的主要类和函数可以被外部轻松访问。这是构建 Python 包时的常见做法,旨在提高代码的模块化和易用性。