當遇到無法導入某個python
模塊時,可能會是沒有安裝某個模塊,也有可能是某模塊在加載過程中失敗,也有可能是陷入了循環(huán)導入的問題。本文將為大家詳細分析python
導入錯誤相關內(nèi)容,一起來看看吧,希望對大家
學習python有所幫助。
1. 模塊未安裝或者路徑不對
ImportError: No mudule named myModule
有兩種可能,一是該模塊沒有安裝,一般可以用
pip install %module_name%
來解決。注意有時候模塊安裝包名并不等于要導入的模塊名。這種情況下可以通過pip search | list
命令來嘗試找到正確的包。
另一種情況就是包雖然安裝了,但當前運行的程序加載的路徑有錯。python
運行時將從以下位置嘗試加載
python modules:
*
當前目錄
*
環(huán)境變量
$PYTHONPATH
所指示的值,這是一個由
“
:
”
分隔的字符串,各個子字符串都是文件系統(tǒng)的一個路徑。
*
標準庫目錄,如
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
程序并未安裝,則會出現(xiàn)這樣的錯誤。
另一種錯誤情況是,使用相對路徑導入時,父模塊還未導入成功。見下面的代碼:
main.
py
mypackage/
__init__.
py
mymodule.
py
myothermodule.
py
mymodule.py
如下所示:
#!/usr/bin/env python3
# Exported function
def
as_int(a):
return int(a)
# Test function for module
def
_test():
assert as_int('1') == 1
if __name__ == '__main__':
_test()
以及myothermodule
代碼如下所示:
#!/usr/bin/env python3
from .mymodule
import as_int
# Exported function
def
add(a, b):
return as_int(a) + as_int(b)
# Test function for module
def
_test():
assert add('1', '1') == 2
if __name__ == '__main__':
_test()
如果執(zhí)行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
3. 循環(huán)導入
這種錯誤稱之為"circular (or cyclic) imports"
。是
python
獨有的一種導入錯誤,在象
java
這樣的語言中就不存在。
假設有如下兩個文件,
a.py和b.py?
:
#a.py
print "a in"
import sys
print "b imported: %s" % ("b"
in sys.modules, )
import b
print "a out"
print b.x
以及:
#b.py
print "b in"
import a
print "b out"
x = 3
執(zhí)行python
a.py?
,將得到以下結果:
$ python a.py
a in
b imported: False
b in
a in
b imported: True
a out
Traceback (most recent
call
last):
File "a.py", line 4,
in <
module>
import b
File "/home/shlomme/tmp/x/b.py", line 2,
in <
module>
import a
File "/home/shlomme/tmp/x/a.py", line 7,
in <
module>
print b.x
AttributeError: 'module'
object has
no
attribute 'x'
出現(xiàn)這種情況的原因是產(chǎn)生了循環(huán)導入。循環(huán)導入,以及在導入過程中python
進行了加鎖操作,最終導致在模塊
b
未導入完成時就引用了其中的名字。
判斷導入錯誤是否是因為循環(huán)導入引起的,主要看堆棧中是否出現(xiàn)兩次重復的導入。比如上述堆棧中a.py
出現(xiàn)兩次,因此可以判斷是這個文件引起的循環(huán)導入。
要解決這個問題,可以把模塊看成一種資源,對所有要引入的模塊進行編號,再按靜態(tài)資源排序法順次導入,就可以避免循環(huán)導入。
來源:
黑斑馬筆記