当我在 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”语句
中的代码test_2.py
只会在您第一次import test_2
在解释器会话期间执行。
您正在尝试%run
从 IPython 内部进行此操作。test_2
自从启动 IPython 以来,您可能至少导入过一次。因此,没有什么可运行的。
如果您退出 Python 并从 bash/cmd 中键入python test_2_test.py
,您将看到10
和30
都被打印出来。
或者,如果您启动一个全新的 IPython 会话并且%run test_2_test.py
,同样的事情:它会打印两个值。但只是第一次;如果你%run
再一次,在同一个会话中,你只会看到30
.
无论如何,如果你想欺骗 Python 重新运行你的模块,你可以这样做:
import sys
del sys.modules['test_2']
import test_2
这通常是一个坏主意,但是对于在模块中测试顶级代码的特定情况,您没有做任何其他事情......好吧,这种情况是公开记录的原因的一半:
这是一个将模块名称映射到已加载模块的字典。这可以被操纵以强制重新加载模块和其他技巧。请注意,从此字典中删除模块与调用
reload()
相应的模块对象不同。
对于更简洁的解决方案,您可以将 Python 告诉reload
模块而不是导入它:
reload(test2)
……但这对你的情况没有多大好处,因为你想运行test_2_test
并让它做导入,你不想自己做。
有关更多详细信息,您可以阅读导入工作原理的详细信息,从imp
. 但坦率地说,我不会费心学习 3.4 之前的导入是如何工作的;只需等到您准备好升级。新版本更简洁,文档更完善,并且不会在一年半内完全过时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句