[英]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__
功能并不强制存在a
和b
,所以当你想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.