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

树莓派中Python脚本如何调用同目录另一脚本的自定义函数

问题根因

你遇到的NameError: name "forwards" is not defined报错,和文件是否在同目录无关,核心是两个写法错误:

  • 错误1:import functions.py是无效导入语法,Python导入自定义模块时不需要加.py后缀,加后缀会直接导致模块识别失败。
  • 错误2:就算写对了import functions,直接裸调用forwards()也会报错——这种导入方式下,被导入模块的所有函数、变量都归属在functions独立命名空间下,当前脚本的全局作用域里根本没有forwards这个名字,自然会抛出未定义错误。
正确跨脚本调用方法

两个文件放在同一目录的前提下,选以下任意一种写法即可:

方法1:导入整个模块(推荐,无命名冲突风险)

  1. 把drive.py里错误的import functions.py语句删除,在文件开头保留正确的模块导入:
import functions
# 其余你原来写的RPi.GPIO、time导入、GPIO初始化代码保持不变
  1. 所有调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 17:18:22