Pydev:将stdout发送到真实(tty)终端

时间:2012-05-09 16:25:50

标签: python console pydev

跟进上一个问题(subprocess: PyDev console vs. cmd.exe),有没有办法改变PyDev发送stdout的位置 - 即tty终端?

我遇到过几个没有tty终端限制的情况。对于子进程模块的情况,我可以使用CREATE_NEW_CONSOLE标志,但在其他情况下,例如在这个问题(Print \r correctly in console)中,PyDev控制台似乎不支持使用转义字符。

任何想法都表示赞赏。

2 个答案:

答案 0 :(得分:1)

我通常通过标准库中的logging模块处理这样的问题,这非常好,但我认为你有充分的理由想要这个。

如果PyDev控制台支持完整的终端仿真,我会感到惊讶。至少在Windows上的Helios下,我对Unicode显示没有任何问题,但终端逃脱是另一回事。

如果您具体了解要使用的终端,可以在其中运行sleep 3600,然后在测试驱动程序中执行此操作:

import sys
def redirect_terminal(ttypath):
  term = open(ttypath, 'w+')
  sys.stdout = term
  sys.stderr = term

在交互式解释器中尝试这个,这可能与在PyDev中运行它有点不同,我在初始终端得到这个(注意本地回显和提示仍然在这里返回):

>>> redirect_terminal('/dev/pts/0')
>>> dir()
>>> raise TypeError
>>>

这在/dev/pts/0终端:

['__builtins__', '__doc__', '__name__', '__package__', 'redirect_terminal', 'sys']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError

虽然我没有在这里尝试任何终端转义,但它们只是像其他任何一样打印的字节序列,因此它们应该打印在远程终端上。

我无法在交互式解释器中收集来自不同终端的输入。当我尝试时,仍然从初始终端读取输入。

答案 1 :(得分:0)

目前这是Eclipse中的限制...(PyDev继承)。

Aptana Studio确实有一个可以作为替代品使用的终端视图,但目前还没有计划这样做。

回答下面的评论,要从正在运行的Python程序创建一个新的shell,可以使用下面的代码:

import subprocess
import sys
import os
args = [sys.executable] + sys.argv
new_environ = os.environ.copy()

if hasattr(subprocess, 'CREATE_NEW_CONSOLE'):
    popen = subprocess.Popen(args, env=new_environ, creationflags=subprocess.CREATE_NEW_CONSOLE)
    exit_code = popen.wait()
else:
    #On Linux, CREATE_NEW_CONSOLE is not available, thus, we use xterm itself.
    args = ['xterm', '-e'] + args
    popen = subprocess.Popen(args, env=new_environ)
    popen.wait() #This exit code will always be 0 when xterm is executed.