1

我正在尝试从 SCons SConstruct 脚本调用 ct-ng ( http://crosstool-ng.org/ ),所以基本上是从 Python 调用。

使用以下方法:

 ret =  subprocess.call(["/mnt/build/pw_build/crosstool-ng/bin/ct-ng  menuconfig"], env=env_cross,shell=True)

crosstool-ng 使用 ncurses 向用户显示菜单:

在此处输入图像描述

不幸的是,当我尝试浏览菜单时:

在此处输入图像描述

使用我看到的箭头键时使用 cat 显示序列:

:/mnt/build$ cat > /dev/null
^[OA^[OD^[OB^[OC^[OA^[OB^[OD^[OC^[OA^[OB

似乎有些东西可能会从序列中剥离转义字符。

当我从终端的命令行调用 ct-ng 脚本时,它可以正常工作,而当我使用subprocess.call()调用它时,事情就会变糟。

我的环境包括:

  • xfce4-终端 0.6.3
  • Linux 3.13.0-32-lowlatency #57-Ubuntu SMP PREEMPT Tue Jul 15 04:08:59 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
  • Python 2.7.6
  • NCURSES_VERSION "5.9"
  • GNU Make 3.81
  • crosstool-NG 版本 1.19.0

我看到的是已知问题吗?还有什么我应该做的吗?

更新:谢谢埃里克……这让我到达了 0.5 英尺……我现在可以浏览菜单,但它仍然会留下粪便:

在此处输入图像描述

4

2 回答 2

3

要在 Python 下运行 curses 程序,我建议您使用pexpect

例如,这里有一个简单的程序,它启动一个副本vim,添加一些文本,转义到命令模式,发出一个 :w 命令,然后与用户交互(允许他或她继续编辑或其他)。然后控件返回到 Python:

#!/usr/bin/env python
import pexpect
child = pexpect.spawn("/usr/bin/vim")
child.send('a\n\nThis is another test.')
child.send('\x1b')
child.send(':w! test.txt\n')
child.interact()

您还可以将参数(例如转义字符和用于输入和输出的过滤器函数)传递给交互方法。但是这些有点棘手。(另一方面,它们将成为您的自定义键盘宏系统,介于用户和正在运行的应用程序之间.spawn())。

(顺便说一句:您可以将所需的击键序列发送到此ct-ng对话框/菜单中......只需弄清楚这些序列对于您的终端设置需要是什么。例如在我的 MacOS X 下运行 TERM=xterm 的 iTerm -256color “向下箭头”光标移动显示为 ^[[B ([Esc][Bracket][B])。这将是 '\x1b[B' 作为 Python 字符串文字)。

于 2014-08-05T03:34:32.580 回答
0

在仔细跟踪执行后,有一个脚本重定向到tee导致问题的原因。

感谢所有关注问题的人。我应该首先看到这一点;对不起噪音。

于 2014-08-05T01:53:29.333 回答