给定一个带有模块名称的字符串,如何导入模块中的所有内容,就像调用了:
from module import *
即。给定字符串S =“模块”,如何得到以下等价物:
__import__(S, fromlist="*")
这似乎没有按预期执行(因为它不会导入任何东西)。
答案 0 :(得分:33)
请重新考虑。唯一比import *
更糟糕的是 magic import *
。
如果你真的想:
m = __import__ (S)
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir (m)
for attr in attrlist:
globals()[attr] = getattr (m, attr)
答案 1 :(得分:6)
这是我为Django动态命名本地设置文件的解决方案。请注意,检查下方的添加不包括导入文件中包含“__”的属性。 __name__
全局被本地设置文件的模块名称覆盖,导致manage.py中使用的setup_environ()
出现问题。
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)
答案 2 :(得分:0)
潜在的问题是我正在开发一些Django,但是在不止一个主机上(与同事一起),都有不同的设置。我希望在project / settings.py文件中执行类似的操作:
from platform import node
settings_files = { 'BMH.lan': 'settings_bmh.py", ... }
__import__( settings_files[ node() ] )
这似乎是一个简单的解决方案(因此优雅),但我同意它有一种气味,当你必须使用John Millikin发布的逻辑时,简单就会消失(谢谢)。这基本上是我采用的解决方案:
from platform import node
from settings_global import *
n = node()
if n == 'BMH.lan':
from settings_bmh import *
# add your own, here...
else:
raise Exception("No host settings for '%s'. See settings.py." % node())
这对我们的目的来说很好。
答案 3 :(得分:0)
在您的案例中,您似乎也可以在模块的词典中使用 dict.update():
config = [__import__(name) for name in names_list]
options = {}
for conf in config:
options.update(conf.__dict__)
更新:我认为它有一个简短的“功能”版本:
options = reduce(dict.update, map(__import__, names_list))
答案 4 :(得分:-1)
我没有找到一个好方法,所以我从http://www.djangosnippets.org/snippets/600/
采取了一种更简单但更丑陋的方式try:
import socket
hostname = socket.gethostname().replace('.','_')
exec "from host_settings.%s import *" % hostname
except ImportError, e:
raise e