You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 12:48:13