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



我在几个 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__.pypython 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" )。

相关内容

  • 没有找到相关文章

最新更新