2017-02-25 326 views
0

當從別名試圖import - 這常見於scala我很驚訝地看到下面的結果:導入模塊

創建一個別名

import numpy as np 

使用別名導入模塊它包含

from np import linalg 

    ImportError: No module named np.linalg 

python中是否有任何其他語法/等效用於導入模塊?

+1

from numpy import linealg – Laszlowaty

+0

你的例子工作正常。你的意思是你真的嘗試過'從np import linalg'? – BrenBarn

回答

9

使用import module as name確實不是創建別名。你誤解了進口系統。

導入做了兩兩件事:

  1. 加載模塊到內存中,並把結果保存在sys.modules。這完成一次只有;隨後的導入重新使用已經加載的模塊對象。
  2. 在當前命名空間中綁定一個或多個名稱。

as name語法可讓您在上一步中控制名稱。

對於from module import name語法,您仍然需要命名完整模塊,因爲在sys.modules中查找module。如果你真的想爲這個別名,你可以在那裏添加額外的引用:

import numpy # loads sys.modules['numpy'] 
import sys 

sys.modules['np'] = numpy # creates another reference 

注意,在這種特定情況下,進口numpy還引發numpy.linalg負荷,因此,所有你需要做的就是:

import numpy as np 
# np.linalg now is available 

不需要模塊別名。對於不自動導入子模塊包,你必須使用:

import package as alias 
import package.submodule 

alias.submodule隨後可無論如何,因爲一個子模塊始終作爲父包的屬性。

+0

thx Martijn我得到了'NameError:name'numpy'未定義':你能驗證該片段嗎?嗯,我已經做了'np進口np',所以我需要'sys.modules ['np'] = np' – javadba

+0

@javadba:你真的運行了'import numpy'嗎? –

+0

這個效果很好 - 得等幾分鐘才能獲獎 – javadba

1

我對你的例子的理解是,既然你已經導入了numpy,你不能用別名重新導入它,因爲它已經導入了linalg部分。