3

跟进上一个问题(子进程:PyDev 控制台 vs. cmd.exe),有没有办法改变 PyDev 发送标准输出的位置——即到 tty 终端?

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

任何想法表示赞赏。

4

2 回答 2

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

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

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

于 2012-05-09T17:26:39.680 回答
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.
于 2012-05-10T11:14:46.243 回答