在Python中导入时执行代码

时间:2018-07-08 04:32:17

标签: python

当我在python文件中导入模块时,我希望在执行导入模块的文件时执行导入的代码。

代码如下:

在test_2.py文件中,我只有几行简单内容:

x = 10
y = 20

c = x-y

print c

def func1():
    return x+y 

这已导入另一个文件test_2_test.py:

import test_2
x = test_2.func1()
print x

这是我执行test_2_test时的输出:

  

%run“ D:/ Projects / Initiatives / machine   learning / programs / test_2_test.py“ 30

我不知道为什么不执行“ print c”语句

2 个答案:

答案 0 :(得分:4)

test_2.py中的代码只会在解释器会话期间第一次 执行。

您正在尝试从IPython内部import test_2进行此操作。自启动IPython以来,您至少已导入%run一次。因此,没有什么可运行的。

如果退出Python,然后从bash / cmd中键入test_2,则会看到python test_2_test.py10都被打印出来。

或者,如果您启动一个全新的IPython会话和30,则相同:它将打印两个值。但是只有第一次;如果再次%run test_2_test.py,则在同一会话中,您只会看到%run


无论如何,如果您想诱使Python重新运行模块,则可以这样操作:

30

这通常不是一个好主意,但是对于测试模块中顶级代码的特定情况,您不做任何其他事情……那是这种情况的一半。是publicly documented

  

这是一个字典,将模块名称映射到已加载的模块。可以对其进行操作以强制重新加载模块和其他技巧。请注意,从此词典中删除模块与在相应的模块对象上调用import sys del sys.modules['test_2'] import test_2 不同。


对于更简洁的解决方案,您可以告诉Python reload该模块而不是将其导入:

reload()

…但这对您的情况没有多大好处,因为您想运行reload(test2) 并让它 进行导入,所以您不想自己做。


有关更多详细信息,您可以阅读从imp开始的导入方式的详细信息。但坦率地说,我不会费心学习3.4之前的导入方式。只需等到准备升级即可。新版本更干净,文档更完整,并且一年半之内不会完全过时。

答案 1 :(得分:0)

我想我找到了问题所在。我在Canopy GUI下执行代码,并且由于某种原因确实不执行导入。我在Canopy下打开了命令提示符,并得到了预期的结果。

我可能会将此报告给有思想的人