在 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”语句

阿巴纳特

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

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

如果您退出 Python 并从 bash/cmd 中键入python test_2_test.py,您将看到1030都被打印出来。

或者,如果您启动一个全新的 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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章