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

标签 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 7 月 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.5f 路...我现在可以浏览菜单,但它仍然留下粪便:

Enter image description here

最佳答案

要在 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-256color 运行的 iTerm 上,“向下箭头”光标移动显示为 ^[[B ([Esc][Bracket][B])。那将是 '\x1b[B'作为 Python 字符串文字)。

关于python - 使用 Python subprocess.call() 启动 ncurses 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24946988/

相关文章:

python - 将字符串格式化为 Python 中的特定字符限制

python - 如何在对象的属性(也是对象)属性发生变化时自动调用对象的方法?

c++ - 如何在 Centos 6.5 上构建 freetype?

c - 使用命令行参数读取文本文件不起作用

特定点的颜色 - ncurses

python - 登录到管理页面后,Django服务器立即停止

python - Python 中的二维动画

python - 在 Django 模板中更改站点名称?

regex - Sed 不使用正则表达式

ncurses 窗口中的光标不在所需位置