4

pexpectを使用してCLIプログラムを起動するスクリプトがあります。これは、いくつかのコマンドを入力できるプロンプトが表示されるシェルのように機能します。

私が抱えている問題は、このプログラムが色付きのプロンプトを使用していることだと思います。

これが私がすることです

import pprint
import pexpect

1 a = pexpect.spawn('program')
2 a.expect("prompt>")
3 print "---------start------------"
4 print(a.before)
5 a.sendline("command")
6 a.expect("prompt>")
7 print "---------before------------"
8 pprint.pprint(a.before)
9 print "---------after------------"
10 pprint.pprint(a.after)

これは出力です:

> python borken.py
---------start------------
A lot of text here from the enjoying programs start-up, lorem ipsum ...  
---------before------------
' \x1b[0m\x1b[8D\x1b[K\x1b[1m\x1b[34m'
---------after------------
'prompt>'

何らかの理由で、最初のプロンプトの色分けが問題を引き起こし、8行目のa.beforeが文字化けしているため、5行目のコマンドが実際に大量の出力を生成したことを確認しても、通常の印刷は機能しません。

誰かが問題が何であるかを知っていますか、または色を避けるためにpexpectで端末タイプを設定することは可能ですか?

私はtcshシェルを使用しています

4

2 に答える 2

8

わかりました、私は答えを見つけました。cslの答えは私を正しい道に導きました。

pexpectには、使用できると思った「env」オプションがあります。このような:

a = pexpect.spawn('program', env = {"TERM": "dumb"})

しかし、これは私にとっては機能しない新しいシェルを生成します。私たちの開発環境は多くの環境変数に依存しています:/

しかし、シェルを生成する前にこれを行うと:

import os
os.environ["TERM"] = "dumb"

現在の「TERM」と「ダム」を変更すると、色がサポートされなくなり、問題が解決しました。

于 2008-12-11T12:52:34.980 に答える
2

ターミナルを設定するためのpexpectドキュメントには何も見つかりませんでしたが、おそらくシェルを使用してプログラムを明示的に開始し、そこでターミナルタイプを設定することができます。

shell_cmd = 'ls -l | grep LOG > log_list.txt'
child = pexpect.spawn('/bin/bash', ['-c', shell_cmd])
child.expect(pexpect.EOF)

あなたは次のようなことを試すことができます

child = pexpect.spawn('TERM=vt100 /bin/bash', ['-c', shell_cmd])

初期化ファイルの読み取りを回避するために、-norcなどを使用してbashを開始することもできます。bashのmanページを確認してください。

于 2008-12-11T09:38:59.270 に答える