Python匯入模組時遇到的錯誤分析,python匯入模組遇到

來源:互聯網
上載者:User

Python匯入模組時遇到的錯誤分析,python匯入模組遇到

當遇到無法匯入某個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)給出了更詳細的解答。

3. 迴圈匯入

這種錯誤稱之為"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

執行python a.py,將得到以下結果:

$ 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'

出現這種情況的原因是產生了迴圈匯入。迴圈匯入,以及在匯入處理程序中python進行了加鎖操作,最終導致在模組b未匯入完成時就引用了其中的名字。

判斷匯入錯誤是否是因為迴圈匯入引起的,主要看堆棧中是否出現兩次重複的匯入。比如上述堆棧中a.py出現兩次,因此可以判斷是這個檔案引起的迴圈匯入。

要解決這個問題,可以把模組看成一種資源,對所有要引入的模組進行編號,再按靜態資源排序法順次匯入,就可以避免迴圈匯入。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.