我在几个 Python 项目中看到了以下代码,在 __main__.py
中。有人可以解释一下目的吗?当然,它将包含__main__.py
的目录放在sys.path
的头部,但为什么呢?为什么要进行测试(__package__ is None and not hasattr(sys, 'frozen')
?另外,在sys.path.insert
中,为什么os.path.dirname
被称为两次?
import sys
if __package__ is None and not hasattr(sys, 'frozen'):
# direct call of __main__.py
import os.path
path = os.path.realpath(os.path.abspath(__file__))
sys.path.insert(0, os.path.dirname(os.path.dirname(path)))
os.path.dirname(os.path.dirname(path))
- 获取祖父目录(包含给定path
变量目录的目录); 这被添加到系统的PATH
变量中。
os.path.realpath(os.path.abspath(__file__))
- 获取正在运行的文件的绝对路径的realpath
(解析符号链接)。
通过此方法,项目现在可以执行包含在该祖父目录中的二进制文件,而无需为二进制可执行文件添加前缀。
旁注:如果没有上下文,你会看到这段代码,很难给出更多关于为什么使用它的答案。
__package__
的测试允许代码在使用 python __main__.py
或 python package/
等命令(直接命名文件或命名包文件夹的路径)运行时运行package/__main__.py
,而不是运行包python -m package
主模块的更正常方式。另一个检查(用于sys.frozen
)测试软件包是否已与类似py2exe
打包到单个文件中,而不是在正常的文件系统中。
代码的作用是将包的父文件夹放入 sys.path
.也就是说,如果__main__.py
位于/some/path/to/package/__main__.py
,代码将把/some/path/to
放在sys.path
中。每次调用dirname
都会从路径右侧剥离一个项目 ( "/some/path/to/package/__main__.py"
=> "/some/path/to/package"
=> "/some/path/to"
)。