1. 程式人生 > >解決:ImportError: No module named 'xxxx'-------python中關於import語句的認識2

解決:ImportError: No module named 'xxxx'-------python中關於import語句的認識2

在使用網上找來的python程式碼的時候,我經常會碰到這個import語句引發的錯誤:

ImportError: No module named 'xxxx'

比如我找的程式碼裡有這麼幾句:

from Tkinter import *
import tkMessageBox
結果報錯:

ImportError: No module named 'Tkinter'

這很有可能是因為找到的程式碼是python2.x的,然而卻把它放在python3.x的環境下跑。其實上面的Tkinter庫在python3裡已經改名了,變成了tkinter,只是首字母變小寫了,但是import語句是對大小寫敏感的!

其實有個很好的辦法來完成由2.x的程式碼到3.x的程式碼的轉換,這裡再以tkinter庫為例,方法如下:

1.開啟tkinter庫的資料夾,比如我的就是C:\Python34\Lib\tkinter,檢視其目錄結構,如下圖

tkinter庫的目錄結構

我們立刻能發現整個庫的結構,每個庫的各個模組的名字一目瞭然。

2.更改相應的import語句,Tkinter改成tkinter,然後

import tkMessageBox
改成
import tkinter.messagebox #對應著tkinter資料夾底下的messagebox.py

改成這種形式要注意接下來在引用的時候必須把import後邊的符號全部寫出來,否則出錯:

messagebox.showinfo("title","hello world") #NameError: name 'messagebox' is not defined
tkinter.messagebox.showinfo("title","hello world") #正確

或者改成

from tkinter import messagebox #對應著tkinter資料夾底下的messagebox.py
則可以寫成
messagebox.showinfo("title","hello world") 

最後補充兩點要注意的地方:

1.packages可以認為是資料夾,而modules則可以看作是資料夾下的.py檔案,而各色各樣的import語句歸結起來就是

from packages1.packages2 import modules1

或者

import packages1.packages2.modules1

2.

from tkinter import *
並不是將tkinter資料夾下的所有.py檔案都import,實際上只是import了__init__.py中的所有物件,比如__init__.py中有個Tk物件,所以在使用了上面這條import語句後,可以直接引用Tk:
root = Tk()
但是如果想使用messagebox.py裡的物件,還是得老老實實地引用它:
from tkinter import messagebox #對應著tkinter資料夾底下的messagebox.py