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

在zb_control.py中启动adxl345test.py报错/bin/sh:1:未找到文件的解决方法

解决 adxl345test.py: not found 错误的实用方案

你遇到的这个报错本质是系统要么找不到指定的脚本文件,要么不知道该用什么解释器来运行它,咱先拆解原因,再给你对应的解决办法:

报错原因拆解

出现/bin/sh: 1: adxl345test.py: not found通常是这几个情况:

  • 脚本不在当前程序的工作目录里,你又没写完整的绝对路径
  • 脚本没有设置可执行权限,系统没法直接运行它
  • 脚本开头没加shebang声明,而且调用时没明确指定Python解释器

方案1:直接指定Python解释器调用(最稳妥)

这是最不容易踩坑的方式,直接告诉系统用Python来运行脚本,同时一定要写脚本的绝对路径(避免当前工作目录变化导致找不到文件)。修改你zb_control.py里的run分支代码:

if inc == 'run':
    print("---------------")
    print("Collecting data")
    print("---------------")
    # 替换成你实际的Python版本(树莓派常用python3)和脚本绝对路径
    p = subprocess.Popen(["python3", "/home/pi/adxl345test.py"], stdout=subprocess.PIPE)

比如你的脚本放在/home/pi/projects/目录下,就把路径改成/home/pi/projects/adxl345test.py。


方案2:给脚本加可执行权限和shebang(进阶方式)

如果你想直接像运行命令一样启动脚本(不用写python前缀),需要两步操作:

  1. 给脚本加shebang行:打开adxl345test.py,在最顶部添加这一行:
#!/usr/bin/env python3

这行代码告诉系统“用系统里的python3解释器来运行这个脚本”。
2. 设置可执行权限:打开终端,执行命令给脚本加权限:

chmod +x /home/pi/adxl345test.py

完成后,修改zb_control.py的调用代码,还是要写绝对路径:

p = subprocess.Popen(["/home/pi/adxl345test.py"], stdout=subprocess.PIPE)

额外的代码优化建议

你的脚本还有两个潜在问题,顺便帮你优化下:

  1. 如果用户先输入stop再输入run,变量p还没定义,会直接报错NameError
  2. 每次循环都重新打开串口,其实没必要,会浪费资源

优化后的完整代码:

import serial, time, subprocess

# 提前初始化串口,避免每次循环重复打开
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
# 用变量跟踪数据采集进程的状态
data_process = None

while True:
    # 串口读取的是字节,要解码成字符串再对比
    inc = ser.readline().strip().decode('utf-8')
    if inc == 'run':
        # 检查进程是否未启动或已经结束,避免重复启动
        if data_process is None or data_process.poll() is not None:
            print("---------------")
            print("Collecting data")
            print("---------------")
            # 替换成你的脚本绝对路径
            data_process = subprocess.Popen(["python3", "/home/pi/adxl345test.py"], stdout=subprocess.PIPE)
        else:
            print("Data collection is already running!")
    elif inc == 'stop':
        # 检查进程是否正在运行,再执行停止操作
        if data_process is not None and data_process.poll() is None:
            data_process.kill()
            data_process = None
            print("-----------------------")
            print("Script has been stopped")
            print("-----------------------")
        else:
            print("No data collection process is running!")

这个版本会帮你避免重复启动、误停止不存在的进程,同时串口也只初始化一次,更稳定。


内容的提问来源于stack exchange,提问作者user75374

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:01:56