交互式Python解释器后台运行

5
我在后台启动交互式Python控制台时遇到了一个奇怪的问题。 从后台恢复解释器后,它不会显示我输入的任何文本(即仅显示“ >>>”提示符),尽管它将解释我写的内容。 按下[enter]键会在同一行上创建另一个“ >>>”提示符。
重现问题的简单方法只需键入:
python &
fg

如果您在前景中启动程序,将其放入后台并将其返回到前景,则不会出现此问题:
python
[ctrl-z]
bg
fg

如果你想知道为什么要在后台启动交互式解释器,可以考虑以下场景:我有一个运行时间很长的仿真程序,但是当它完成后,我想与结果进行交互。因此,我启动了程序:
python -i simulation.py &
fg #(after it's finished running)

简单的解决方法就是先在前台启动它,然后将其移至后台,稍后再将其带回前台,但我想知道为什么会发生这种情况。

你是否安装了readline模块?我曾经看到过类似的行为,当时是由于readline与BSD libedit构建而不是GNU libreadline。虽然这已经有好几年了... 请问你使用的是哪个发行版/版本、哪个Python版本,以及顺便问一下,使用的是哪个shell和终端程序以及它们的版本? - abarnert
另外,simulation.py 是否与 termiosttycurses 或类似的模块有关联?或者它是否向终端写入二进制数据? - abarnert
我正在使用Ubuntu 13.04,Python 2.7和Bash。脚本没有执行您列出的任何操作,但我不确定这是否相关,因为即使没有脚本(python&),您也可以重现问题。 - sheridp
Bash版本4.2.45(1)-release(x86_64-pc-linux-gnu) - sheridp
我可以在CentOS(bash 3.2.25)上重现这个问题,但在OS X(bash 3.2.48)上却不能。 - Lukas Graf
显示剩余3条评论
1个回答

2

在将解释器置于前台后,考虑执行以下命令来强制终端 ECHO 模式:

import termios
attr = termios.tcgetattr(1)
attr[3] = attr[3] | termios.ECHO
termios.tcsetattr(1, termios.TCSANOW, attr)

有没有想法为什么终端的ECHO属性会被取消设置? - sheridp
基本上和你的解決方案一樣:import os; os.system('reset') 或者 os.system('stty sane')。不過我仍然不確定為什麼本地回顯被禁用了。同樣有趣的是,在解譯器外(在背景中使用python)執行reset或stty sane並不能解決問題。 - sheridp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接