Python函数中的导入语句失败

1 投票
1 回答
658 浏览
提问于 2025-04-17 20:49

我有一个Python模块,需要在Windows和Linux上都能运行。运行时,它会对某些键盘“快捷键”做出响应。这是一个Python 3.3的脚本。

在我的类构造函数中,我做了以下操作:

self.setup_stdin()

函数setup_stdin是这样的:

def setup_stdin(self):
    self.osname = os.name
    if self.osname == 'posix':
        self.setup_posix_stdin()
    elif self.osname == 'nt':
        self.setup_nt_stdin()

在Linux上运行时,我对setup_posix_stdin没有任何问题,它只是让stdin变成非阻塞的,这样我就可以处理按键。

setup_nt_stdin是这样的:

def setup_nt_stdin(self):
    import msvcrt

但是,当我在Windows 7上运行时,我的程序崩溃了,出现了以下错误:

NameError: global name 'msvcrt' is not defined

为了绕过这个问题,当我在Windows上运行时,我把导入语句放到了文件的顶部,并把setup_nt_stdin函数的内容替换成了pass,这样就能正常工作了。

我原以为可以从一个函数中导入东西。这个函数在一个类里面,我是不是漏掉了什么其他的语法?

1 个回答

1

import 语句只是在本地范围内绑定了导入模块的名称。

为了绕过这个限制,你可以这样做:

def setup_nt_stdin(self):
    global msvcrt
    import msvcrt

不过,考虑到你可以多次使用 import 而不会重复执行,而且在实际使用 msvcrt 这个名称之前,你需要检查操作系统,可能在每个需要它的 Windows 特定函数内部直接 import msvcrt 会更合理。

撰写回答