2017-07-31 14 views
0

端末の背景色を取得するために、https://github.com/rocky/bash-term-backgroundから抽出されたいくつかのシェルコードを示します。私はそれがあまりにも値を検索することができますので、Pythonでこの動作を模倣したいと思います:xtermと互換性のあるTTYカラークエリコマンドですか?

stty -echo 
# Issue command to get both foreground and 
# background color 
#   fg  bg 
echo -ne '\e]10;?\a\e]11;?\a' 
IFS=: read -t 0.1 -d $'\a' x fg 
IFS=: read -t 0.1 -d $'\a' x bg 
stty echo 
# RGB values are in $fg and $bg 

私はこれのほとんどを翻訳することができますが、私はとの問題を抱えている部分がecho -ne '\e]10;?\a\e]11;?\a'です。

私は、と思うだろう:

output = subprocess.check_output("echo -ne '\033]10;?\07\033]11;?\07'", shell=True) 

は、Python 2.7で、合理的な翻訳になりますが、私は任意の出力を取得しておりません。

rgb:e5e5e5/e5e5e6 
rgb:000000/000000 

しかし、私は何も見ていません。

更新:Mark Setchellは、問題の一部がサブプロセスで実行されている可能性があると示唆しています。だから私はPythonコードを変更するとき:

print(check_output(["echo", "-ne" "'\033]10;?\07\033]11;?07'"])) 

私は今、プログラムが終了した後にだけ、RGB値の出力を見る。これは、xtermが非同期で送信していると思われる出力を見るために問題が発生していることを示しています。

第二の更新:meuhのコードに基づいて、私はあなただけrawモードにそれを設定した後、stdoutにエスケープシーケンスを作成し、標準入力に応答を読み取る必要があるhttps://github.com/rocky/python-term-background

+1

出力を読み取るために、別の完全に別のサブプロセスを次の行で開始していますか? –

+0

'shell = True'は、yesを示しています。このパラメータを削除すると、xtermの出力が表示されます。変数には取り込まれません。だから、私がする必要があるのは、手前でstdoutをリダイレクトしてそれを待つか、端末から直接読み込む方法を見つけ出すことです。この新しい重要な情報を含めるように質問を改訂しました。おかげさまで – rocky

答えて

1

でこれのより完全なバージョンを配置しました:

#!/usr/bin/python3 
import os, select, sys, time, termios, tty 

fp = sys.stdin 
fd = fp.fileno() 

if os.isatty(fd): 
    old_settings = termios.tcgetattr(fd) 
    tty.setraw(fd) 
    print('\033]10;?\07\033]11;?\07') 
    time.sleep(0.01) 
    r, w, e = select.select([ fp ], [], [], 0) 
    if fp in r: 
     data = fp.read(48) 
    else: 
     data = None 
     print("no input available") 
    termios.tcsetattr(fd, termios.TCSADRAIN, old_settings) 
    if data: 
     print("got "+repr(data)+"\n") 
else: 
    print("Not a tty") 
+0

これは近いです。私が編集で提案した2つの簡単に固定された問題があります。そして、私は私がどのように修正するかを知っているかどうかわからない。まず、stdinがttyかどうかを確認する必要があります。次に、読み込みにはタイムアウトが必要です。しかし最後の問題は、xterm互換でない端末では、エスケープ文字列がエコーされているのを見ることです。私はそれを望んでいません。 – rocky

+0

Hmm。たぶん、私はPOSIXシェルの 'stty -echo'コマンドのようなものが必要でしょうか? – rocky

+0

'setr​​aw()'はすでにエコービットをクリアしていると思います。あなたは 'TERM'値を探し、' xterm'のように知っているものだけを受け入れることができます。 – meuh

関連する問題