【问题标题】:Pydev: Send stdout to a real (tty) terminalPydev:将标准输出发送到真实(tty)终端
【发布时间】:2012-05-09 16:25:49
【问题描述】:

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

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

感谢任何想法。

【问题讨论】:

  • 这听起来像是 PyDev 中的一个错误。
  • 是的,可能更多的是限制而不是错误(可能与 eclipse 中的控制台的配置方式有关?)。 PyDev 开发团队似乎已经意识到了这一点,因为他们回答了我之前的问题。

标签: python console pydev


【解决方案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

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

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

【讨论】:

  • Windows 中的 ttypath 会使用什么?
  • 不确定。我认为它在 Windows 中的工作方式非常不同。简单地打开一个特殊文件并替换sys.stdout 可能无法删除它。
【解决方案2】:

这是当前 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.

【讨论】:

  • 有没有办法从 PyDev 中生成一个 tty 终端?
  • 这是一个外部进程。例如,如果我想编写覆盖一行输出的代码,例如this question,是否可以对所有标准输出使用 tty 终端?
  • 如何为 Django 项目添加这个?它会进入 managed.py 文件吗?我需要在 managed.py 文件中注释或修改什么?
  • 对于 django,您必须修补 shell 的创建。看看:github.com/fabioz/Pydev/blob/… -- 寻找 patch_django_autoreload(),处理 patch_show_console == True 的部分(注意最新版本的 PyDev 不再有该代码,因为在 PyDev 中杀死进程将不再留下僵尸进程活着,因此,该代码已被删除)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多