如何在Unix中使用pexpect从对话框获取文本?

2 投票
1 回答
572 浏览
提问于 2025-04-17 07:47

我这里有一个shell脚本,内容如下:

#!/bin/bash
CPUSELECTION="1 386SX off \
              2 386DX on \
              3 486SX off \
              4 486DX off "
#dialog --backtitle "Select CPU" --radiolist "Select the cpu" 10 40 4 $CPUSELECTION
echo $CPUSELECTION

现在我的py文件是

import pexpect

child = pexpect.spawn ('sh /tmp/test.sh')
child.expect('386DX')
fp = open('/tmp/test.txt', 'w')

print >> fp, "Before 386DX:", child.before
print >> fp, "After 386DX:", child.after


child.expect('486SX')
print >> fp, "Before 486SX:", child.before
print >> fp, "After 486SX:", child.after

fp.close()

这个脚本的输出是

$ cat /tmp/test.txt
Before 386DX: 1 386SX off 2 
After 386DX: 386DX
Before 486SX:  on 3 
After 486SX: 486SX

通过这个我可以获取到一些文本之间的内容。

但是如果我使用对话框的话

#!/bin/bash
CPUSELECTION="1 386SX off \
              2 386DX on \
              3 486SX off \
              4 486DX off "
dialog --backtitle "Select CPU" --radiolist "Select the cpu" 10 40 4 $CPUSELECTION
#echo $CPUSELECTION

我得到的输出就很乱。

有没有办法从对话框中获取到纯文本呢?

这个带有对话框的shell脚本是第三方提供的,所以我们不能修改这个脚本 :(。

请提供一个解决方案,不要改变shell脚本。

1 个回答

3

你看到的那些乱七八糟的输出其实是ANSI转义码。这些代码可以用下面这种方法去掉:

ansi_codes = re.compile('\033\[[0-9;]+m')
def strip_ansi(with_ansi):
    return ansi_codes.sub('', with_ansi)

然后,你可以使用

strip_ansi(child.before)

这样你就只会看到纯文本了。虽然对话框的边框线还是会显示,但处理起来应该会简单一些。

撰写回答