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

Python 3.x调用Bash脚本未等待执行完成问题求助

解决Python在Windows+Cygwin环境下未等待Bash脚本执行完毕的问题

嘿,我完全懂你这会儿的头疼——明明用subprocess.call调用了Bash脚本,结果Python根本没等脚本里的sleep 10跑完,直接就打印"end"了对吧?这问题的根子在Windows默认的shell上,咱们一步步把它搞定。

问题根源

当你在Windows下执行subprocess.call("sleep.sh", shell=True)时,系统默认会用cmd.exe来处理这个命令,而不是Cygwin的Bash。cmd压根不认识.sh脚本里的Bash语法,它会直接跳过脚本执行流程,导致Python误以为脚本已经跑完,自然就提前输出"end"了。

解决方案

这里有几个靠谱的处理办法,你挑适合自己的用就行:

1. 明确指定Cygwin的Bash解释器

把subprocess.call的参数改成直接调用Cygwin的bash.exe,让它来负责处理你的脚本。示例代码如下:

import subprocess
print("start")
# 注意替换成你实际的Cygwin安装路径,32位版本路径是C:/cygwin/bin/bash.exe
subprocess.call(["C:/cygwin64/bin/bash.exe", "-c", "./sleep.sh"], shell=False)
print("end")

这样Python会明确调用Cygwin的Bash来执行脚本,肯定会等sleep 10执行完毕才继续往下走。

2. 在调用命令里显式指定用Bash执行

如果你的Cygwinbin目录已经加到系统PATH里了,也可以直接在调用命令前加上bash关键字:

import subprocess
print("start")
subprocess.call("bash sleep.sh", shell=True)
print("end")

这种方式更简洁,但前提是你在cmd里输入bash能正常启动Cygwin终端(证明系统能找到bash命令)。

3. 给脚本添加可执行权限(可选)

虽然不是必须步骤,但给sleep.sh加上可执行权限能更贴近Linux下的使用习惯:
打开Cygwin终端,进入脚本所在目录,执行:

chmod +x sleep.sh

验证效果

修改完代码后运行callBash.py,你会看到先打印"start",然后等待10秒,最后才输出"end"——这就说明问题解决啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:32:02