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

树莓派使用Python subprocess执行shell脚本失败问题求助

解决Python subprocess调用run.sh提示文件不存在的问题

问题描述

在树莓派上搭建的安防摄像头切换脚本中,选择选项2启动直播脚本正常;但切换到选项1启动安防系统时,直播进程能正常终止,却无法执行/home/pi/Desktop/run.sh,提示文件不存在,而手动运行该脚本时功能完全正常。

排查与解决方案

1. 验证路径的绝对正确性

先在终端执行命令确认文件真实存在且路径无误:

ls /home/pi/Desktop/run.sh

也可以在Python脚本中加入路径检查代码,确认程序能识别到该文件:

import os
# 在run_security_system函数前添加检查
print(os.path.exists("/home/pi/Desktop/run.sh"))

如果返回False,说明路径存在大小写错误或实际路径不符(树莓派文件系统默认大小写敏感),请仔细核对路径中的每一个字符。

2. 修改subprocess调用方式

方式一:直接执行脚本(推荐)

先给run.sh添加可执行权限:

chmod +x /home/pi/Desktop/run.sh

然后修改Python中的run_security_system函数:

def run_security_system():
    security_system = subprocess.Popen(["/home/pi/Desktop/run.sh"])
    return security_system

这种方式无需通过sh中转,直接调用脚本本身,避免shell解析路径时的潜在问题。

方式二:使用shell=True参数

如果不想给脚本加可执行权限,可以修改调用时添加shell=True:

def run_security_system():
    security_system = subprocess.Popen("/home/pi/Desktop/run.sh", shell=True)
    return security_system

注意:shell=True存在一定安全风险,仅在调用可信脚本时使用。

3. 指定subprocess的工作目录

subprocess默认工作目录可能与终端不同,可通过cwd参数指定工作目录为run.sh所在的桌面路径:

def run_security_system():
    security_system = subprocess.Popen(["sh", "/home/pi/Desktop/run.sh"], cwd="/home/pi/Desktop")
    return security_system

4. 修正run.sh中的相对路径

手动运行脚本时,~会被解析为当前用户的家目录,但subprocess调用时可能因环境变量差异导致解析异常。将run.sh中的相对路径改为绝对路径:

#!/bin/bash

# 替换~为绝对路径
source /home/pi/env/bin/activate
cd /home/pi/Desktop/Al-YamamaEyeALPHA
python main.py

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 04:33:32