从A.B导入X使用__import__?

时间:2012-03-03 07:17:44

标签: python 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

我们非常感谢任何建议。

2 个答案:

答案 0 :(得分:3)

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__ 1}}在“来自输入”模式。

所以解决方案如下。假设'yotta'是一个字符串变量,我使用getattr进行属性访问。

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

答案 1 :(得分:1)

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

参数fromlist相当于from LHS import RHS右侧


From the docs:

  

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

     

[...]

     

fromlist提供了的名称或子模块,应该从name提供的模块中导入。

     

[...]

     

另一方面,声明from spam.ham import eggs, sausage as saus导致

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

(强调我的。)