歡迎加入QQ討論群258996829
麥子學院 頭像
蘋果6袋
6
麥子學院

Python學習之導入錯誤詳解

發(fā)布時間:2017-08-30 19:54  回復:0  查看:2817   最后回復:2017-08-30 19:54  
當遇到無法導入某個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.pyb.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)導入。
來源: 黑斑馬筆記

您還未登錄,請先登錄

熱門帖子

最新帖子

?