国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Python導入模塊時遇到的錯誤分析

2020-01-04 16:50:13
字體:
供稿:網(wǎng)友

當遇到無法導入某個python/51048.html">python模塊時,可能會是沒有安裝某個模塊,也有可能是某模塊在加載過程中失敗,也有可能是陷入了循環(huán)導入的問題。本文詳細解釋了這個問題。

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.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()

如果執(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
[這篇文章](#Relative imports in Python 3)給出了更詳細的解答。

3. 循環(huán)導入

這種錯誤稱之為"circular (or cyclic) imports"。是python獨有的一種導入錯誤,在象java這樣的語言中就不存在。

假設有如下兩個文件,a.py和b.py:

#a.pyprint "a in"import sysprint "b imported: %s" % ("b" in sys.modules, )import bprint "a out"print b.x

以及:

#b.pyprint "b in"import aprint "b out"x = 3

執(zhí)行python a.py,將得到以下結(jié)果:

$ python a.pya in          b imported: Falseb ina inb imported: Truea outTraceback (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 aFile "/home/shlomme/tmp/x/a.py", line 7, in <module>  print b.xAttributeError: '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)導入。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 苏尼特右旗| 石棉县| 安庆市| 开平市| 宁强县| 金昌市| 天全县| 饶河县| 无为县| 东乡族自治县| 凤城市| 辰溪县| 成都市| 天台县| 精河县| 金寨县| 惠东县| 玛曲县| 东光县| 于田县| 礼泉县| 玉山县| 兰西县| 古交市| 平顶山市| 乌恰县| 彭泽县| 大理市| 东明县| 九龙城区| 石棉县| 巴林右旗| 汉阴县| 化隆| 邯郸市| 邳州市| 灵丘县| 前郭尔| 彩票| 茌平县| 长海县|