使用curses库

时间:2017-03-14 17:06:52

标签: ncurses curses xterm python-curses

当试图运行像 https://github.com/asciimoo/drawille/blob/master/examples/rotating_cube.py

使用我的普通用户,我总是得到奇怪的字符,如

M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM-!~OM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM- ~IM-bM-!~GM-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@ M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M-bM- ~@M

使用root运行时看起来很正常,我的终端在执行

之类的操作时会正确打印unicode字符

python -c 'print unichr(0x28ff)' 要么 echo -e '\u285a'

在两个用户环境中,

和$ TERM都设置为xterm,欢迎任何提示。

由于

2 个答案:

答案 0 :(得分:0)

您的“普通用户”没有设置区域设置,以便ncurses看到它支持UTF-8编码。要查看差异,请以普通用户身份运行locale命令,并以root身份运行时将其与输出进行比较。

顺便说一句, M 表示“meta”,表示具有第八(最重要)位集的字符。回到7位ASCII常见的日子,而8位字符相对较新,有些人决定特别对待它。如果未设置您的语言环境(即POSIX),那基本上是7位ASCII。

unctrl的手册页中提到了部分内容(包括使用 M- 作为前缀)。

关于后续(依赖于不在问题中的信息),这是Python的一个老问题,我认为这是固定的。正如我在 python+ncurses: I can't display accents 中指出的那样,Python并没有真正区分 ncurses ncursesw 基于 接口 ,但只有 名称 ,并且其他一些组件可能会在您之前加载错误的名称进入curses模块:

  

比这更复杂:python的加载“ncurses”   动态。

     

加载哪一个并不重要(但是它)   明确指定库名称。其他一些   包(如readline)单独加载ncurses库    - 并且他们还指定了库名。而不是抽象   填充到另一个(更容易更改)级别,它嵌入代码中。

     

如果初始化脚本更改为加载“ncursesw”,则加载python   可以使用ncursesw而无需进一步更改。有一些补丁   我在bug报告中提到的配置启用了   python这样做。那些是python的补丁当然......

     

(大约一年前,这是关于这个新闻组的讨论主题)。

答案 1 :(得分:0)

谷歌谷歌通过重新安装python 3.4.3解释器,看起来像python curses动态库

$ ll /home/snebel29/.pyenv/versions/*/lib/python*/lib-dynload/*cur*
-rwxr-xr-x 1 snebel29 snebel29  42620 Jan 28  2016 /home/snebel29/.pyenv/versions/2.6.6/lib/python2.6/lib-dynload/_curses_panel.so*
-rwxr-xr-x 1 snebel29 snebel29 254035 Jan 28  2016 /home/snebel29/.pyenv/versions/2.6.6/lib/python2.6/lib-dynload/_curses.so*
-rwxr-xr-x 1 snebel29 snebel29  42520 May 16  2015 /home/snebel29/.pyenv/versions/2.7.6/lib/python2.7/lib-dynload/_curses_panel.so*
-rwxr-xr-x 1 snebel29 snebel29 254661 May 16  2015 /home/snebel29/.pyenv/versions/2.7.6/lib/python2.7/lib-dynload/_curses.so*
-rwxr-xr-x 1 snebel29 snebel29 320512 Mar 15 11:50 /home/snebel29/.pyenv/versions/3.4.3/lib/python3.4/lib-dynload/_curses.cpython-34m.so*
-rwxr-xr-x 1 snebel29 snebel29  46244 Mar 15 11:50 /home/snebel29/.pyenv/versions/3.4.3/lib/python3.4/lib-dynload/_curses_panel.cpython-34m.so*

应指向libncursesw.so.5

$ ldd /home/snebel29/.pyenv/versions/3.4.3/lib/python3.4/lib-dynload/_curses.cpython-34m.so
    linux-vdso.so.1 =>  (0x00007fffecad1000)
    libncursesw.so.5 => /lib/x86_64-linux-gnu/libncursesw.so.5 (0x00007f868e9d0000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f868e7a7000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f868e589000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f868e1c4000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f868dfc0000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f868ee1b000)

并且以某种方式指向libncurses.so.5,请参阅此处以获取我的2.7.6解释器,其中仍然是faling

$ ldd /home/snebel29/.pyenv/versions/2.7.6/lib/python2.7/lib-dynload/_curses.so
    linux-vdso.so.1 =>  (0x00007ffcb3f60000)
    libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007feed55be000)
    libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007feed5395000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007feed5177000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007feed4db2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007feed4bae000)
    /lib64/ld-linux-x86-64.so.2 (0x00007feed59f5000)

但是我仍然无法理解图书馆工作的原因而不是其他原因,特别是为什么使用root帐户运行会让它有效...