當遇到無法導入某個python模塊時,可能會是沒有安裝某個模塊,也有可能是某模塊在加載過程中失敗,也有可能是陷入了循環導入的問題。本文詳細解釋了這個問題。
1. 模塊未安裝或者路徑不對
ImportError: No mudule named myModule
有兩種可能,一是該模塊沒有安裝,一般可以用
pip install %module_name%
來解決。注意有時候模塊安裝包名并不等于要導入的模塊名。這種情況下可以通過pip search | list命令來嘗試找到正確的包。
另一種情況就是包雖然安裝了,但當前運行的程序加載的路徑有錯。python運行時將從以下位置嘗試加載python modules:
* 當前目錄
* 環境變量$PYTHONPATH所指示的值,這是一個由“:”分隔的字符串,各個子字符串都是文件系統的一個路徑。
* 標準庫目錄,如dist-site-packages下的模塊。
* 在.pth文件中指定的路徑,如果存在.pth文件的話。
可以使用以下方式來查看python運行時的包含路徑:
import sysprint(sys.path)
在運行出錯的腳本裝頭部加上這一段代碼,然后在控制臺中查看打印出來的python類庫路徑,檢查安裝包是否已包含在上述路徑中。
***可以通過下面的方式將未包含在路徑中的模塊臨時包含進來:***
sys.path.append("path/to/module")
另外,還可以在shell窗口中查看當前的python包含路徑:
echo $PYTHONPATH
2. 無法導入已存在的模塊
如果要導入的模塊包含了native代碼,并且native代碼加載(初始化)失敗時,就會導致這種錯誤。使用ssl, gevent等涉及native的模塊時,如果對應的native程序并未安裝,則會出現這樣的錯誤。
另一種錯誤情況是,使用相對路徑導入時,父模塊還未導入成功。見下面的代碼:
main.pymypackage/ __init__.pymymodule.pymyothermodule.py
mymodule.py如下所示:
#!/usr/bin/env python3# Exported functiondef as_int(a): return int(a)# Test function for module def _test(): assert as_int('1') == 1if __name__ == '__main__': _test()以及myothermodule代碼如下所示:
#!/usr/bin/env python3from .mymodule import as_int# Exported functiondef add(a, b): return as_int(a) + as_int(b)# Test function for module def _test(): assert add('1', '1') == 2if __name__ == '__main__': _test()如果執行mypackage/myothermodule,則會報以下錯誤:
Traceback (most recent call last):
File "myothermodule.py", line 3, in <module>
from .mymodule import as_int
SystemError: Parent module '' not loaded, cannot perform relative import
[這篇文章](#Relative imports in Python 3)給出了更詳細的解答。
新聞熱點
疑難解答