如何在Python中从指定文件夹路径运行.sh脚本
解决方案
错误原因说明
你之前的写法无法生效有两个核心原因:
- 每个
subprocess创建的子进程运行环境独立,第一个cd命令执行后仅作用于当前子进程,后续执行脚本的子进程不会继承目录切换的结果 - 开启
shell=True时如果传入列表参数,仅第一个元素会被作为shell命令执行,其余参数会被当作命令的额外参数处理,因此cd操作不会和脚本执行关联生效
可行方案
方案1:使用cwd参数指定工作目录(最推荐)
subprocess的执行方法原生提供cwd参数,可直接指定子进程的运行工作目录,无需手动执行cd命令,安全性最高。
注意路径中的~属于shell的用户目录占位符,需要用os.path.expanduser展开为实际绝对路径:
import subprocess import os # 展开用户目录占位符,获取脚本所在目录的绝对路径 script_dir = os.path.expanduser("~/ros_ws") # 指定工作目录运行脚本 subprocess.call(["./intera.sh"], cwd=script_dir)
方案2:合并命令为单字符串执行(仅适用于路径无特殊字符场景)
如果需要保留cd+执行的写法,需要把两条命令用&&拼接为单个字符串,同时开启shell=True:
import subprocess subprocess.call("cd ~/ros_ws && ./intera.sh", shell=True)
注意:该方式存在shell注入风险,若路径包含用户可控的特殊字符不要使用该方案
方案3:直接调用脚本绝对路径(仅适用于脚本不依赖自身所在目录相对资源的场景)
如果你的.sh脚本内部没有用到相对路径访问同目录下的其他文件,也可以直接调用脚本的绝对路径:
import subprocess import os script_full_path = os.path.expanduser("~/ros_ws/intera.sh") subprocess.call([script_full_path])
额外注意事项
运行前请确保.sh脚本有可执行权限,可在终端执行以下命令添加权限:chmod +x ~/ros_ws/intera.sh
内容的提问来源于stack exchange,提问作者gapansi99
相关产品推荐
相关产品推荐

