在自己内部导入py文件

时间:2014-01-24 06:50:30

标签: python python-internals

这是test.py:

import sys

a = 50
b = [1,2]

def change():
    print "Here 1"
    import test
    print "Here 2"
    test.a = -1
    test.b = [0,1]
    return

def main():
    print "Here 3"
    change()
    print "Here 4"
    print a, b

if 1:
    main()

在系统上运行时,上面的python代码会生成以下输出:

Here 3
Here 1
Here 3
Here 1
Here 2
Here 4
-1 [0, 1]
Here 2
Here 4
50 [1, 2]

我很困惑为什么不存在“Here 1 \ n Here 3”输出的无限循环。如何证明打印a,b输出是否合理?

4 个答案:

答案 0 :(得分:14)

当您将文件作为脚本运行时,它不被视为test模块。它被认为是__main__模块。

当执行命中import test时,文件的第二次执行开始,模块被认为是test

当执行再次点击import test时,Python会识别出它已经导入test并且不会重新执行该模块。相反,它只是将半初始化的test模块对象加载到当前命名空间中并继续。 Python的乐观假设是您编写了代码,以便在导入完成之前不需要test的内容。

当执行到达test.atest.b的分配时,它会影响test模块,但不影响__main__,尽管它们来自同一个文件。因此,导入模块中的print a, b会反映新值,而来自print a, b的{​​{1}}会反映初始值。

答案 1 :(得分:0)

文件只能导入一次。 “导入测试”行在第一次遇到时成功。当第二次遇到它时,解释器将检查它是否已被加载。

最初运行某个程序时,它不会被视为“已导入”。

答案 2 :(得分:0)

此脚本的一般流程如下:

  1. Main运行,因此打印'Here 3'
  2. 更改被调用,因此它打印'Here 1'
  3. 导入测试时,python运行test的主要功能
  4. 第二次调用更改时,python足够聪明,知道测试已经导入,因此它有效地跳过了该行。
  5. 导入的主要完成
  6. 原始脚本完成运行。

答案 3 :(得分:0)

虽然user2367112's excellent answer解释了为什么会发生这种情况,但这里的答案都没有提供解决方法。

有两种简单的方法可以达到预期的行为。

  1. 而不是导入test,而是使用import __main__。如果您使用import __main__ as test指定别名,则甚至不需要更改任何其他代码。
  2. 你可以设置sys.modules['test'] = sys.modules['__main__']告诉python“嘿,这个模块已经存在”。在此之后,import test将不会重新导入模块,从而使您的代码按预期工作。 sys.modules上的相关文档可以找到here