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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 22:27:31