如何使用Python的__import__函数执行"import*from module"的等效操作?

Bri*_*unt 18 python python-import

给定一个带有模块名称的字符串,如何导入模块中的所有内容,就像调用了:

from module import *
Run Code Online (Sandbox Code Playgroud)

即给定字符串S ="模块",如何得到相当于以下内容:

__import__(S, fromlist="*")
Run Code Online (Sandbox Code Playgroud)

这似乎没有按预期执行(因为它不会导入任何东西).

Joh*_*kin 34

请重新考虑.唯一比魔术更糟的import *是. import *

如果你真的想:

m = __import__ (S)
try:
    attrlist = m.__all__
except AttributeError:
    attrlist = dir (m)
for attr in attrlist:
    globals()[attr] = getattr (m, attr)
Run Code Online (Sandbox Code Playgroud)

  • 要迂腐,如果没有__all__,则只导入不以_开头的名称. (5认同)
  • 是的,绝对没有理由为什么每个设置都应该存在于全局命名空间中,即`options.some_option`明显优于`some_option`.您也可以在特定情况下对模块的差异使用**dict.update()**. (2认同)

小智 6

这是我为Django动态命名本地设置文件的解决方案.请注意,检查下方的添加不包括导入文件中包含"__"的属性.在__name__全球正在改写本地设置文件的模块名称,这引起setup_environ(),在manage.py使用,有问题.

try:
    import socket
    HOSTNAME = socket.gethostname().replace('.','_')
    # See http://docs.python.org/library/functions.html#__import__
    m = __import__(name="settings_%s" % HOSTNAME, globals=globals(), locals=locals(), fromlist="*")
    try:
        attrlist = m.__all__
    except AttributeError:
        attrlist = dir(m)        
    for attr in [a for a in attrlist if '__' not in a]:
        globals()[attr] = getattr(m, attr)

except ImportError, e:
    sys.stderr.write('Unable to read settings_%s.py\n' % HOSTNAME)
    sys.exit(1)
Run Code Online (Sandbox Code Playgroud)