__name__在python中实际做了什么?

时间:2016-12-13 12:30:48

标签: python import python-import importerror

首先我要说的是,我在Python中并不陌生。我非常了解if __name__ == '__main__':使用。我只是想了解 Python解释器如何处理这个。我编写了两个脚本来测试Python中可能的内容。请注意,这实际上非常糟糕的Python - 我不会利用这些东西。我只想了解的可能性

main.py:

import bad.py


def main():

    print "Hello, World!"


if __name__ == '__main__':

    main()

bad.py:

__name__ = '__main__' # I expected an Error caused by this line


def main():

    exit() # I know that this function shouldn't be used


if __name__ == '__main__':

    main()

运行main.py没有输出,我真的没想到输出。

我想知道的事情:

  • __name__ = '__main__'中的bad.py会自动更改__name__中的变量main.py吗?或者可以存在两个不同的 '__main__' - 模块吗?
  • 是否可以仅通过操纵import替换__name__语句?如果是的话,你会怎么做?
  • 当我将exit()更改为print "Hello",时,输出为"Hello",然后出现错误:

    Traceback (most recent call last):
      File "main.py", line 1, in <module>
        import bad.py
    ImportError: No module named py
    

    有人可以解释这种行为吗?

  • python版本/操作系统之间有什么区别吗?我在Linux2上的Python 2.7.6中尝试了这个例子

修改

当然import bad.py不起作用。 import - 语句不需要任何文件结尾。我犯了这个错误,因为我也在C中编程。我将行改为import bad。输出现在看起来像这样:

Hello Hello, World

2 个答案:

答案 0 :(得分:0)

将导入语句更改为import bad

如果该程序直接作为主程序运行,if __name__ == '__main__':意图是运行此代码。如您所见,您可以覆盖名称值,但如果删除if check in bad,则会产生相同的效果。

    bad.py中的
  • __name__独立于main.py中的__name__。当你再次从另一个程序调用main.py时,你可以看到。
  • 导入功能与__name__属性完全不同。所以没有。
  • 您收到错误,因为在完成错误后,main继续执行下一次导入。它无法导入py。

添加更多打印语句以遵循逻辑。您也可以打印__name__本身以查看这些值。

答案 1 :(得分:0)

您的代码中发生了一些事情:

首先,您的导入行import bad.py Isn&#39;我导入文件bad.py.它正在执行搜索see here for the search logic以查找名为bad的模块,其中的查找和= n一次bad被导入后,它会在该模块中查找对象调用py,它没有找到而是返回导入错误。 (在退出()。导入bad之前退出的版本已完成,因此它没有机会尝试查找py

其次名称。由解释器和导入逻辑为每个模块定义,当文件加载名称时,您可以在此之后更改它(如bad.py)。它也适用于模块,更改bad.__name__不会更改main__name