首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从A.B导入使用__import__的X?

从A.B导入使用__import__的X?
EN

Stack Overflow用户
提问于 2012-03-03 15:17:44
回答 2查看 1.2K关注 0票数 3

假设A是包目录,B是目录中的模块,X是用B编写的函数或变量。如何使用__import__()语法导入X?以scipy为例:

我想要的:

代码语言:javascript
复制
from scipy.constants.constants import yotta

不起作用的是:

代码语言:javascript
复制
>>> __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

任何建议都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-03-03 17:38:26

python import语句执行两个任务:加载模块并使其在名称空间中可用。

代码语言:javascript
复制
import foo.bar.baz 

将在名称空间中提供名称foo,而不是baz,因此__import__将提供foo

代码语言:javascript
复制
foo = __import__('foo.bar.baz')

另一方面,

代码语言:javascript
复制
from foo.bar.baz import a, b

没有使模块可用,但是import语句执行赋值所需的是baz。这对应于

代码语言:javascript
复制
_tmp_baz = __import__('foo.bar.baz', fromlist=['a', 'b'])
a = _tmp_baz.a
b = _tmp_baz.b

当然,不会让临时的东西变得可见。

__import__函数并不强制使用ab,因此当您需要baz时,只需在fromlist参数中输入任何内容,即可将__import__置于"from input“模式。

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

代码语言:javascript
复制
yotta = getattr(__import__('scipy.constants.constants', 
                           fromlist=['yotta']), 
                'yotta')
票数 4
EN

Stack Overflow用户

发布于 2012-03-03 15:19:13

代码语言:javascript
复制
__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',全局变量(),本地变量(),‘鸡蛋’,‘香肠’,-1)鸡蛋= _temp.eggs saus = _temp.sausage

(重点是我的。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9544331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档