在Spyder中运行独立.py文件函数遇NameError的解决方法
解决跨文件函数调用时的NameError问题
问题分析
你遇到的NameError: name 'get_rate' is not defined本质是命名空间隔离导致的:
- 你在主文件里导入了
get_rate,这个函数只存在于主文件的命名空间中 - 用
%run加载getfx.py时,脚本是在自己独立的命名空间里执行的,它看不到主文件里已经导入的get_rate,所以testFunc调用时就会报错
而把所有代码放一个文件时,所有变量和函数都在同一个命名空间,自然能正常访问。
解决方案
根据你的实际需求(文件体量大,不能合并),推荐两种可行方案:
方案1:让函数文件自行管理依赖(推荐)
在getfx.py的开头直接导入所需的模块和函数,保证它自身的命名空间包含所有依赖:
# getfx.py from forex_python.converter import get_rate from datetime import datetime # 你的代码里用到了datetime,也要记得导入哦 def testFunc(A): B = get_rate('USD', 'JPY', datetime(2020,7,8).date()) * A return B
这样不管你在哪里运行getfx.py,或者从其他文件导入它的函数,都不会出现依赖缺失的问题,是最规范的模块化做法,适合大型项目维护。
方案2:让脚本在主文件命名空间执行(临时测试用)
如果你不想修改getfx.py,可以给%run加上-i参数,让脚本在当前(主文件)的命名空间里执行,这样它就能访问主文件里已经导入的get_rate:
# 主文件 from forex_python.converter import get_rate from datetime import datetime # 同样要确保datetime也在主命名空间里 %run -i '/Users/mak/Dropbox/Python/Templates/getfx.py' testFunc(2)
这种方式适合临时调试,但缺点是getfx.py的可移植性差——如果其他人单独运行它,还是会因为缺少依赖报错。
额外提醒
你的代码里用到了datetime,不管用哪种方案,都要确保它在对应的命名空间里被导入,否则会遇到同样的NameError问题哦。
内容的提问来源于stack exchange,提问作者absk
相关产品推荐
相关产品推荐

