使用subprocess.call运行shell脚本报Permission denied权限错误
问题根源
两种调用方式的权限要求完全不同:
- 手动执行
bash download_R1.sh时,是将脚本作为参数传入bash程序,全程由bash读取脚本内容解释执行,仅需要当前用户对脚本有读权限即可,不需要脚本本身具备可执行权限。 subprocess.call('./download_R1.sh')的逻辑是让操作系统直接将该文件作为可执行程序启动,此时系统会强制校验文件的可执行权限位,未开启可执行权限时就会抛出PermissionError: [Errno 13] Permission denied,和你在终端直接敲./download_R1.sh(不带bash前缀)的报错逻辑完全一致。
解决方案
二选一即可:
- 方案1:对齐手动执行的逻辑,显式调用bash运行脚本,无需修改文件权限,推荐写法:
import subprocess downR1 = subprocess.call(['bash', './download_R1.sh'])
注意:subprocess传参优先使用列表格式,避免路径包含空格、特殊字符时出现解析错误。
- 方案2:给脚本添加可执行权限后直接调用:
- 终端执行
chmod +x download_R1.sh为脚本开启可执行位 - 确认脚本首行写对shebang声明
#!/bin/bash,指定用bash解释脚本 - 原有
subprocess.call('./download_R1.sh')代码即可正常运行
- 终端执行
内容的提问来源于stack exchange,提问作者tomasz
相关产品推荐
相关产品推荐

