WSL2环境下Python调用webbrowser报错tcgetpgrp failed: Not a tty
解决WSL2中Python调用webbrowser模块报错
tcgetpgrp failed: Not a tty的问题 环境信息
- Windows 11
- WSL version 2
- Ubuntu 20.04.3 LTS
- Python 3.8.10
问题场景
运行以下Python代码时,网页能正常打开,但终端会抛出错误tcgetpgrp failed: Not a tty,进程看似挂起,必须按Ctrl+C才能恢复命令提示符:
import webbrowser webbrowser.open('https://github.com')
问题原因
WSL2的伪终端(pseudo-tty)与Windows原生进程的交互存在兼容性问题:Python的webbrowser模块调用Windows浏览器时,会创建关联子进程,但WSL终端无法正确处理该进程的终端组获取操作,触发tcgetpgrp系统调用失败,最终导致进程挂起。
解决办法
1. 替换webbrowser调用方法
使用webbrowser.open_new_tab()替代webbrowser.open(),该方法在部分场景下可规避终端进程挂起问题:
import webbrowser webbrowser.open_new_tab('https://github.com')
2. 后台运行脚本
在终端执行脚本时添加&,让进程后台运行,避免终端被占用:
python3 your_script.py &
3. 直接调用Windows浏览器(推荐)
通过subprocess模块直接调用Windows浏览器的可执行文件,并设置后台启动,彻底规避终端交互问题:
import subprocess # 示例:调用Edge浏览器,路径需根据实际安装位置调整 subprocess.Popen( ['/mnt/c/Program Files (x86)/Microsoft/Edge/Application/msedge.exe', 'https://github.com'], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL )
如果使用Chrome,路径通常为/mnt/c/Program Files/Google/Chrome/Application/chrome.exe。
4. 调整终端TTY属性
运行脚本前执行以下命令,临时禁止终端向后台进程发送SIGTTOU信号:
stty -tostop
若需永久生效,可将该命令添加到~/.bashrc或~/.zshrc配置文件中。
内容的提问来源于stack exchange,提问作者Gharbad The Weak
相关产品推荐
相关产品推荐

