1. 程式人生 > >python模組以及匯入出現ImportError: No module named 'xxx'問題

python模組以及匯入出現ImportError: No module named 'xxx'問題

python中,每個py檔案被稱之為模組,每個具有__init__.py檔案的目錄被稱為包。只要模組或者包所在的目錄在sys.path中,就可以使用import 模組或import 包來使用。
如果你要使用的模組(py檔案)和當前模組在同一目錄,只要import相應的檔名就好。比如在a.py中使用b.py: 

import b 


但是如果要import一個不同目錄的檔案(例如b.py)該怎麼做呢? 
首先需要使用sys.path.append方法將b.py所在目錄加入到搜素目錄中。然後進行import即可,例如 

import sys 
sys.path.append(‘c:\xxxx\b.py’) # 這個例子針對 windows 使用者來說的 

大多數情況,上面的程式碼工作的很好。但是如果你沒有發現上面程式碼有什麼問題的話,可要注意了!上面的程式碼有時會找不到模組或者包(ImportError: No module named xxxxxx),這是因為: 
sys模組是使用c語言編寫的,因此字串支援 ‘\n’, ‘\r’, ‘\t’等來表示特殊字元。所以上面程式碼最好寫成: 

sys.path.append(‘c:\\xxx\\b.py’) 
或者sys.path.append(‘c:/xxxx/b.py’) 

這樣可以避免因為錯誤的組成轉義字元,而造成無效的搜尋目錄(sys.path)設定。

sys.path是python的搜尋模組的路徑集,是一個list。
可以在python 環境下使用sys.path.append(path)新增相關的路徑,但在退出python環境後,自己新增的路徑就會自動消失了!

搜尋路徑和路徑搜尋

模組的匯入需要叫做“路徑搜尋”的過程。

搜尋路徑:查詢一組目錄

路徑搜尋:查詢某個檔案的操作

ImportError: No module named xxxx 這種錯誤就是說:模組不在搜尋路徑裡,從而導致路徑搜尋失敗!

匯入模組時,不帶模組的字尾名,比如.py
Python搜尋模組的路徑:
1)、程式的主目錄
2)、PTYHONPATH目錄(如果已經進行了設定)
3)、標準連線庫目錄(一般在/usr/local/lib/python2.X/)
4)、任何的.pth檔案的內容(如果存在的話),允許使用者把有效的目錄新增到模組搜尋路徑中去
.pth字尾的文字檔案中一行一行的地列出目錄。

這四個組建組合起來就變成了sys.path了
>>> import sys
>>> sys.path
匯入時,Python會自動由左到右搜尋這個列表中每個目錄。

關於 ImportError: No module named ‘xxx’的問題?
解決方法如下:
1. 使用 PYTHONPATH 環境變數,在這個環境變數中輸入相關的路徑,不同的路徑之間用逗號(英文的!)分開,如果PYTHONPATH 變數還不存在,可以建立它!
這裡的路徑會自動加入到sys.path中,永久存在於sys.path中而且可以在不同的python版本中共享,應該是一樣較為方便的方法。
C:\Users\Administrator\Desktop\test\module1.py:
def func1():
    print(“func1”)

將C:\Users\Administrator\Desktop\test新增到PYTHONPATH即可直接import module1,然後
呼叫:module1.func1()即可。

2. 將自己做的py檔案放到 site_packages 目錄下。

3. 使用pth檔案,在 site-packages 檔案中建立 .pth檔案,將模組的路徑寫進去,一行一個路徑,以下是一個示例,pth檔案也可以使用註釋:

# .pth file for the  my project(這行是註釋),命名為xxx.pth檔案
C:\Users\Administrator\Desktop\test

這個不失為一個好的方法,但存在管理上的問題,而且不能在不同的python版本中共享。

4. 在呼叫檔案中新增sys.path.append(“模組檔案目錄”);

5. 直接把模組檔案拷貝到$python_dir/Lib目錄下。

通過以上5個方法就可以直接使用import module_name了。

》》》參考文章:http://my.oschina.net/leejun2005/blog/109679