Pergunta

I have a python module that needs to be able to run on Windows and Linux. While running it responds to certain keyboard "hotkeys". It is a python 3.3 script.

In my class constructor I do the following:

self.setup_stdin()

The function setup_stdin is this:

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

When I run on Linux, I have no problem with setup_posix_stdin, it just makes stdin non-blocking so I can handle keystrokes.

setup_nt_stdin is the following:

def setup_nt_stdin(self):
    import msvcrt

However, when I run on Windows 7, my program bombs with

NameError: global name 'msvcrt' is not defined

To get around this, when I run on Windows, I move the import statement to the top of the file, and replace the setup_nt_stdin function body with pass, and it works fine.

I thought I could import from a function. This function is inside a class, is there some other syntax I'm missing?

Foi útil?

Solução

The import statement binds the name of the imported module in the local scope only.

To get around this you could do:

def setup_nt_stdin(self):
    global msvcrt
    import msvcrt

Although considering you can import something multiple times without it executing any more and you're going to need guards to check the OS before actually using the name msvcrt elsewhere, it might make more sense to just import msvcrt inside every windows-specific function that needs it.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top