欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python導(dǎo)入模塊時(shí)遇到的錯(cuò)誤分析

 更新時(shí)間:2017年08月30日 08:45:39   作者:楊勇  
這篇文章主要給大家詳細(xì)解釋了在Python處理導(dǎo)入模塊的時(shí)候出現(xiàn)錯(cuò)誤以及具體的情況分析,非常的詳盡,有需要的小伙伴可以參考下

當(dāng)遇到無(wú)法導(dǎo)入某個(gè)python模塊時(shí),可能會(huì)是沒(méi)有安裝某個(gè)模塊,也有可能是某模塊在加載過(guò)程中失敗,也有可能是陷入了循環(huán)導(dǎo)入的問(wèn)題。本文詳細(xì)解釋了這個(gè)問(wèn)題。

1. 模塊未安裝或者路徑不對(duì)

ImportError: No mudule named myModule

有兩種可能,一是該模塊沒(méi)有安裝,一般可以用

pip install %module_name%

來(lái)解決。注意有時(shí)候模塊安裝包名并不等于要導(dǎo)入的模塊名。這種情況下可以通過(guò)pip search | list命令來(lái)嘗試找到正確的包。

另一種情況就是包雖然安裝了,但當(dāng)前運(yùn)行的程序加載的路徑有錯(cuò)。python運(yùn)行時(shí)將從以下位置嘗試加載python modules:

* 當(dāng)前目錄

* 環(huán)境變量$PYTHONPATH所指示的值,這是一個(gè)由“:”分隔的字符串,各個(gè)子字符串都是文件系統(tǒng)的一個(gè)路徑。

* 標(biāo)準(zhǔn)庫(kù)目錄,如dist-site-packages下的模塊。

* 在.pth文件中指定的路徑,如果存在.pth文件的話。

可以使用以下方式來(lái)查看python運(yùn)行時(shí)的包含路徑:

import sys
print(sys.path)

在運(yùn)行出錯(cuò)的腳本裝頭部加上這一段代碼,然后在控制臺(tái)中查看打印出來(lái)的python類庫(kù)路徑,檢查安裝包是否已包含在上述路徑中。

***可以通過(guò)下面的方式將未包含在路徑中的模塊臨時(shí)包含進(jìn)來(lái):***

sys.path.append("path/to/module")

另外,還可以在shell窗口中查看當(dāng)前的python包含路徑:

echo $PYTHONPATH

2. 無(wú)法導(dǎo)入已存在的模塊

如果要導(dǎo)入的模塊包含了native代碼,并且native代碼加載(初始化)失敗時(shí),就會(huì)導(dǎo)致這種錯(cuò)誤。使用ssl, gevent等涉及native的模塊時(shí),如果對(duì)應(yīng)的native程序并未安裝,則會(huì)出現(xiàn)這樣的錯(cuò)誤。

另一種錯(cuò)誤情況是,使用相對(duì)路徑導(dǎo)入時(shí),父模塊還未導(dǎo)入成功。見(jià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,則會(huì)報(bào)以下錯(cuò)誤:

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)給出了更詳細(xì)的解答。

3. 循環(huán)導(dǎo)入

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

假設(shè)有如下兩個(gè)文件,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,將得到以下結(jié)果:

$ 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)導(dǎo)入。循環(huán)導(dǎo)入,以及在導(dǎo)入過(guò)程中python進(jìn)行了加鎖操作,最終導(dǎo)致在模塊b未導(dǎo)入完成時(shí)就引用了其中的名字。

判斷導(dǎo)入錯(cuò)誤是否是因?yàn)檠h(huán)導(dǎo)入引起的,主要看堆棧中是否出現(xiàn)兩次重復(fù)的導(dǎo)入。比如上述堆棧中a.py出現(xiàn)兩次,因此可以判斷是這個(gè)文件引起的循環(huán)導(dǎo)入。

要解決這個(gè)問(wèn)題,可以把模塊看成一種資源,對(duì)所有要引入的模塊進(jìn)行編號(hào),再按靜態(tài)資源排序法順次導(dǎo)入,就可以避免循環(huán)導(dǎo)入。

相關(guān)文章

最新評(píng)論