__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__.py
或 python 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"
).
我在 __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__.py
或 python 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"
).