gpt4 book ai didi

python - 在 Python 中禁用 DSUSP

转载 作者:太空宇宙 更新时间:2023-11-03 11:02:27 24 4
gpt4 key购买 nike

OSX 用户 submitted a bug CTRL+Y 导致 python 终端应用程序 to be suspended , 通过 dsusp导致在 Python 程序尝试读取标准输入时发送 SIGTSTP。下面的代码解决了这个问题:(context)

import sys
import termios
if sys.platform == 'darwin':
attrs = termios.tcgetattr(0)
VDSUSP = termios.VSUSP + 1
attrs[-1][VDSUSP] = 0
termios.tcsetattr(0, termios.TCSANOW, attrs)
  • 如何检测此功能 (dsusp)?有没有我可以使用的基于 os.uname() 或类似的启发式方法?
  • termios.VDSUSP 不存在,即使在有它的系统上也是如此。有没有它丢失的原因?
  • 这种关闭它的行为有多普遍?使用 readline 的程序似乎忽略了 OSX 上的 CTRL+Y,因此它至少相当普遍。我很久以前就将 stty dsusp undef 添加到我的 .bashrc 中,所以没有注意到它。

要查看此暂停行为,请运行 cat 并在 OSX 或其他系统上输入 CTRL+Y Return具有此功能。

$ cat
^Y

[1]+ Stopped cat
$ fg
cat
cat: stdin: Resource temporarily unavailable

最佳答案

我无法检查这方面的实际行为,因为我没有任何计算机的操作系统会具有 DSUSP 行为。然而,在调查这个问题时,我遇到了 issue 7695 in Python bug tracker . VDSUSP 似乎仅在 3.4 之后的 termios 中可用。


Glibc documentation , 就是说

Macro: int VDSUSP

This is the subscript for the DSUSP character in the special control character array. termios.c_cc[VDSUSP] holds the character itself.

The DSUSP (suspend) character is recognized only if the implementation supports job control (see Job Control). It sends a SIGTSTP signal, like the SUSP character, but not right away—only when the program tries to read it as input. Not all systems with job control support DSUSP; only BSD-compatible systems (including GNU/Hurd systems).


因此我建议您检查 termios 中是否存在 VDSUSP - 它从 3.4 开始存在;否则退回到

if any(i in sys.platform for i in ['bsd', 'darwin']):

哪个应该匹配 BSD 和你的 OS X; Hurd 是一个很大的问号,因为我无法确定您的修复是否完全正确(我猜它在所有 BSD 版本上的工作方式类似)。

更简单的做法是:

import subprocess
import time
from distutils.spawn import find_executable

def exec_cmd(*args):
p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, _ = p.communicate()
return stdout

if find_executable('stty'):
modesave = exec_cmd('stty', '-g').strip()
exec_cmd('stty', 'dsusp', 'undef')
print("disabled ctrl-y")
time.sleep(2)
print("enabled ctrl-y")
exec_cmd('stty', modesave)
time.sleep(2)
print("exiting")

至少这不会炸毁我的 Linux,stty 命令本身和 -g 等都是 POSIX 标准。

关于python - 在 Python 中禁用 DSUSP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29024007/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com