树莓派使用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
相关产品推荐
相关产品推荐

