前の質問(サブプロセス:PyDevコンソールとcmd.exe)のフォローアップとして、PyDevがstdoutを送信する場所(つまり、tty端末)を変更する方法はありますか?
tty端末がないことが制限されているいくつかの例に出くわしました。サブプロセスモジュールの場合、CREATE_NEW_CONSOLEフラグを使用できますが、この質問(コンソールで\ rを正しく印刷)などの他の例では、PyDevコンソールはエスケープ文字の使用をサポートしていないようです。
どんな考えでもありがたいです。
前の質問(サブプロセス:PyDevコンソールとcmd.exe)のフォローアップとして、PyDevがstdoutを送信する場所(つまり、tty端末)を変更する方法はありますか?
tty端末がないことが制限されているいくつかの例に出くわしました。サブプロセスモジュールの場合、CREATE_NEW_CONSOLEフラグを使用できますが、この質問(コンソールで\ rを正しく印刷)などの他の例では、PyDevコンソールはエスケープ文字の使用をサポートしていないようです。
どんな考えでもありがたいです。
私は通常、標準ライブラリのモジュールを介してこのような問題に対処します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
ここではターミナルエスケープを試しませんでしたが、他と同じように出力されるバイトシーケンスであるため、リモートターミナルで印刷する必要があります。
インタラクティブインタプリタで別の端末から入力を収集することができません。試してみると、入力はまだ初期端末から読み取られています。
これは現在、Eclipse ...(PyDevが継承する)の制限です。
Aptana Studioには、おそらく代替として使用できるターミナルビューがありますが、現時点ではそうする予定はありません。
以下のコメントに答えて、実行中のPythonプログラムから新しいシェルを作成するには、以下のコードを使用することができます。
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.