2014-03-04 24 views
1

我有一個python模塊,需要能夠在Windows和Linux上運行。運行時會響應某些鍵盤的「熱鍵」。這是一個Python 3.3腳本。python導入語句在函數中失敗

在我的類的構造函數我執行以下操作:

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上運行,我謹導入語句到文件頂部,並用pass替換setup_nt_stdin函數體,並且它工作正常。

我以爲我可以從一個函數導入。這個函數是在一個類裏面,還有一些其他的語法我錯過了嗎?

回答

1

import語句僅在本地作用域中綁定導入模塊的名稱。

要解決這個問題,你可以這樣做:

def setup_nt_stdin(self): 
    global msvcrt 
    import msvcrt 

雖然考慮你可以沒有它import東西多次執行任何更多,你將需要警衛實際使用的名稱msvcrt前檢查OS在其他地方,只需要import msvcrt就足夠了,它可以在每個需要它的Windows特定功能中使用。

+0

那麼,因爲我只有一個使用msvcrt的函數,我選擇了你的後一個解決方案,它只是在該函數中導入。所以,我的setup_nt_stdin就成了一個通行證。在Linux中,我需要做一些事情來設置stdin以使其非阻塞,所以當時我還創建了一個setup_nt_stdin,然後我發現它並不需要做任何事情,但我知道我需要msvcrt,所以我想,呃,我會在那裏導入它。我誤解了一份進口報告的範圍。謝謝。 – user1725779