Bash并行运行Python脚本时报stdin is not a tty错误如何解决
错误根源
你提出的「同一Python文件被多次打开导致报错」的猜测不成立。报错本质是winpty的运行机制和后台进程的TTY绑定规则冲突:
winpty的核心作用是为Windows原生控制台程序模拟POSIX标准的TTY交互终端,运行时默认需要绑定当前会话的TTY资源- 你在命令末尾加
&将进程放到后台执行时,Bash默认会解绑后台进程和当前TTY的关联,导致winpty无法获取可用的TTY,直接抛出stdin is not a tty错误 - 串行运行时进程在前台执行,始终持有当前TTY的访问权限,所以可以正常运行,和你并行运行Python脚本本身没有关联
可行的解决方法
- 方法一:为后台进程重定向输入流
不需要修改原有调用逻辑,直接给命令追加空输入重定向即可,修改后的Bash脚本如下:
#!/bin/bash for i in {1..5}; do winpty python test.py < /dev/null & done wait
末尾追加的wait命令可以保证主进程等待所有后台子进程执行完成后再退出。
- 方法二:非交互脚本直接跳过
winpty
你当前的test.py属于无任何交互逻辑的纯计算脚本,Git Bash运行这类非交互Python脚本时本身不需要winpty做TTY模拟,直接去掉winpty即可正常并行运行:
#!/bin/bash for i in {1..5}; do python test.py & done wait
如果直接运行python存在兼容问题,可以尝试调用Windows原生python.exe的绝对路径,比如/c/Users/你的用户名/AppData/Local/Programs/Python/Python3xx/python.exe。
- 方法三:使用并行工具管理进程
如果需要更可控的并行逻辑(比如控制同时运行的进程数、统一收集输出),可以使用Git Bash自带的parallel工具:
parallel -N0 winpty python test.py < /dev/null ::: {1..100}
这条命令可以直接并行运行100次脚本,默认会用CPU核心数作为同时运行的最大进程数,避免进程过多导致系统卡顿。
内容的提问来源于stack exchange,提问作者Jürg W. Spaak
相关产品推荐
相关产品推荐

