当我在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”语句
答案 0 :(得分:4)
test_2.py
中的代码只会在解释器会话期间第一次 执行。
您正在尝试从IPython内部import test_2
进行此操作。自启动IPython以来,您至少已导入%run
一次。因此,没有什么可运行的。
如果退出Python,然后从bash / cmd中键入test_2
,则会看到python test_2_test.py
和10
都被打印出来。
或者,如果您启动一个全新的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下打开了命令提示符,并得到了预期的结果。
我可能会将此报告给有思想的人