__main__.py 中一些样板代码的用途

Purpose of some boilerplate code in __main__.py

我在 __main__.py 的几个 Python 项目中看到了以下代码。有人可以解释一下目的吗?当然是把包含__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__ 的测试让代码 运行 当 package/__main__.py 已经 运行 时使用像 python __main__.pypython package/ 这样的命令(直接命名文件或命名包文件夹的路径),而不是 运行 包的主模块 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").