2007-07-27

 

Python Cookbook 2.23 从控制台读不回显字符--跨平台方式

需求:

你的程序需要从控制台读入字符,一次一个,不显示在屏幕上,而且要跨平台.

讨论:

当面对跨平台问题时,我们需要封装代码,让他们看起来都是一样的:

try:
    from msvcrt import getch
except ImportError:
    ''' we're not on Windows, so we try the Unix-like approach '''
    def getch( ):
        import sys, tty, termios
        fd = sys.stdin.fileno( )
        old_settings = termios.tcgetattr(fd)
        try:
            tty.setraw(fd)
            ch = sys.stdin.read(1)
        finally:
            termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
        return ch

在windows平台上,Python标准库msvcrt提供了一个很方便的方法getch,来一次一个从键盘读字符,且不回显.然而,这个模块不是类Unix平台上的标准模块之一,我们可以使用tty和termios模块来实现这个功能(当然,这两个模块也不是windows版本Python的标准模块).
在应用程序的角度,我们不应该考虑这些问题,而且,我们应该用跨平台的思路来写程序,而不是去记忆不同平台的标准库有什么区别.Python解决了大部分跨平台的问题,但不是全部.本节的例子就是就是它没有解决的跨平台问题之一.
当我们不能找到一个现成的跨平台的包时,我们应该自己封装一个来使用.本节的代码不仅说明了如何解决问题,也提供了一个编写Python的包的好的方式,
你自己写的模块中,如果要使用与平台相关的标准库时,要用try语句将import包起来,并处理好expect ImportError异常.在expect块的代码中,你可以自己处理如何在另一个平台运行的代码.对于罕见的情况,有时不只需要判断两个平台.但大多数情况下,所有非windows平台都可以属于类unix平台.


Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?