树莓派中Python脚本如何调用同目录另一脚本的自定义函数
问题根因
你遇到的NameError: name "forwards" is not defined报错,和文件是否在同目录无关,核心是两个写法错误:
- 错误1:
import functions.py是无效导入语法,Python导入自定义模块时不需要加.py后缀,加后缀会直接导致模块识别失败。 - 错误2:就算写对了
import functions,直接裸调用forwards()也会报错——这种导入方式下,被导入模块的所有函数、变量都归属在functions独立命名空间下,当前脚本的全局作用域里根本没有forwards这个名字,自然会抛出未定义错误。
正确跨脚本调用方法
两个文件放在同一目录的前提下,选以下任意一种写法即可:
方法1:导入整个模块(推荐,无命名冲突风险)
- 把drive.py里错误的
import functions.py语句删除,在文件开头保留正确的模块导入:
import functions # 其余你原来写的RPi.GPIO、time导入、GPIO初始化代码保持不变
- 所有调用functions.py内自定义函数的位置,都加上
functions.前缀,比如:- 原来写的
forwards(50, 2)改为functions.forwards(50, 2) - 原来写的
backwards(50, 2)改为functions.backwards(50, 2) - 停止、转向类的其他自定义函数,全部按这个规则修改调用写法即可。
- 原来写的
方法2:直接导入指定函数到当前作用域
如果不想每次调用都加模块前缀,可以在导入时直接把需要用到的函数引入当前脚本的全局作用域,替换导入语句为:
from functions import forwards, backwards, stop, left, right # 其余RPi.GPIO、time导入、初始化代码保持不变
这种写法下可以直接写forwards(50, 2)调用函数,不需要加前缀。注意不要在drive.py里定义和导入函数同名的变量/函数,否则会覆盖导入的内容,引发难以排查的bug。
额外排查项
如果修改后依然报错,依次检查两个点:
- 确认
functions.py和drive.py存放在完全相同的目录下,不要把functions.py放到子文件夹、上层目录,或者存成别的文件名 - 核对functions.py内的函数名拼写,比如不要把
forwards漏写末尾的s拼成forward,拼写不匹配也会触发名称未定义错误
注意:自定义脚本不要和Python内置库、已安装的第三方库重名,比如不要把函数文件命名为
time.py、gpio.py,否则导入时会优先加载你的自定义文件,导致官方库/第三方库导入异常。
内容的提问来源于stack exchange,提问作者ReggaeRambo123
相关产品推荐
相关产品推荐

