使用Python subprocess.call()启动ncurses进程

时间:2014-07-25 02:09:45

标签: python linux ncurses scons crosstool-ng

我试图从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向用户显示菜单:

Enter image description here

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

Enter image description here

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

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

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

当我从终端的命令行调用ct-ng脚本时它正常工作,就是当我用 subprocess.call()调用它时,情况变坏了。

我的环境包括:

  • xfce4-terminal 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 version 1.19.0

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

更新:  谢谢埃里克...那让我走了0.5路...我现在可以浏览菜单,但它仍然留下粪便:

Enter image description here

2 个答案:

答案 0 :(得分:2)

要在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()

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

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

答案 1 :(得分:0)

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

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