跟进上一个问题(subprocess: PyDev console vs. cmd.exe),有没有办法改变PyDev发送stdout的位置 - 即tty终端?
我遇到过几个没有tty终端限制的情况。对于子进程模块的情况,我可以使用CREATE_NEW_CONSOLE标志,但在其他情况下,例如在这个问题(Print \r correctly in console)中,PyDev控制台似乎不支持使用转义字符。
任何想法都表示赞赏。
答案 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.