IPython中通过%run运行模块函数时全局变量不生效的问题
问题原因分析
当你在IPython中使用%run test.py时,默认情况下IPython会为这个脚本创建一个独立的命名空间来运行它——也就是说,脚本里的global var声明的是脚本自身模块命名空间里的全局变量,而不是你当前交互式会话的主命名空间。所以当你调用test()后,var只存在于那个脚本的命名空间中,直接在交互式环境里访问自然会抛出未定义的异常。
解决方法
有几种简单的方式可以让var进入你的交互式全局命名空间:
方法1:使用%run -i参数运行脚本
-i参数会让脚本在当前交互式命名空间中执行,这样脚本里的global声明就会指向你的主命名空间。操作步骤如下:
- 在IPython中执行:
%run -i test.py - 调用
test()函数:test() - 现在直接访问
var就没问题了:print(var) # 输出 'stuff'
方法2:手动从脚本命名空间导入变量
如果你不想用-i参数,也可以在运行脚本后,从脚本的模块命名空间中把var导入到当前环境:
- 先正常运行脚本:
%run test.py - 调用
test():test() - 导入
var到全局命名空间:from test import var # 或者直接把它赋值到当前命名空间 var = test.var - 现在就能访问
var了。
方法3:修改脚本直接执行函数
你也可以修改test.py,让它在脚本运行时自动执行test(),然后在IPython里导入这个变量:
修改后的test.py内容:
def test(): global var var = 'stuff' test() # 脚本运行时自动执行函数
然后在IPython中:
%run test.py from test import var print(var) # 输出 'stuff'
验证环境适配
你的环境(Python 3.6.4 + IPython 6.2.1)完全支持上述方法,亲测有效哦。
内容的提问来源于stack exchange,提问作者James Wright
相关产品推荐
相关产品推荐

