解決:ImportError: No module named 'xxxx'-------python中關於import語句的認識2
阿新 • • 發佈:2019-01-01
在使用網上找來的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,檢視其目錄結構,如下圖
我們立刻能發現整個庫的結構,每個庫的各個模組的名字一目瞭然。
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