簡體   English   中英

從AB導入X使用__import__?

[英]from A.B import X using __import__?

假設A是包目錄,B是目錄中的模塊,X是用B編寫的函數或變量。如何使用__import__()語法導入X? 以scipy為例:

我想要的是:

from scipy.constants.constants import yotta

什么行不通:

>>> __import__("yotta", fromlist="scipy.constants.constants")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named yotta

>>> __import__("yotta", fromlist=["scipy.constants.constants"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named yotta

>>> __import__("yotta", fromlist=["scipy","constants","constants"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named yotta

>>> __import__("scipy.constants.constants.yotta", fromlist=["scipy.constants.constats"])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named yotta

任何建議將不勝感激。

python import語句執行兩個任務:加載模塊並使其在命名空間中可用。

import foo.bar.baz 

將在命名空間中提供名稱foo ,而不是baz ,所以__import__會給你foo

foo = __import__('foo.bar.baz')

另一方面

from foo.bar.baz import a, b

沒有使模塊可用,但import語句執行assignmaents需要的是baz。 這對應於

_tmp_baz = __import__('foo.bar.baz', fromlist=['a', 'b'])
a = _tmp_baz.a
b = _tmp_baz.b

當然,沒有使臨時可見。

__import__功能並不強制存在ab ,所以當你想baz你可以給在fromlist里爭論什么把__import__在“從輸入”模式。

所以解決方案如下。 假設'yotta'作為字符串變量給出,我使用getattr進行屬性訪問。

yotta = getattr(__import__('scipy.constants.constants', 
                           fromlist=['yotta']), 
                'yotta')
__import__("scipy.constants.constants", fromlist=["yotta"])

fromlist的參數等同from LHS import RHS右側


來自文檔:

__import__(name[, globals[, locals[, fromlist[, level]]]])

[...]

fromlist給出了應該從name給出的模塊導入的對象或子模塊name

[...]

另一方面, from spam.ham import eggs, sausage as saus的聲明from spam.ham import eggs, sausage as saus結果

 _temp = __import__('spam.ham', globals(), locals(), ['eggs', 'sausage'], -1) eggs = _temp.eggs saus = _temp.sausage 

(強調我的。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM