一个人如何做“相当于”的事;从模块导入*;使用Python';导入函数?

一个人如何做“相当于”的事;从模块导入*;使用Python';导入函数?,python,python-import,Python,Python Import,给定一个带有模块名的字符串,如何导入模块中的所有内容,就好像调用了: from module import * i、 e.给定字符串S=“module”,如何获得以下等价物: __import__(S, fromlist="*") 这似乎没有按预期执行(因为它没有导入任何内容)。请重新考虑。唯一比import*更糟糕的是magicimport* 如果你真的想: m = __import__ (S) try: attrlist = m.__all__ except AttributeE

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

from module import *
i、 e.给定字符串S=“module”,如何获得以下等价物:

__import__(S, fromlist="*")

这似乎没有按预期执行(因为它没有导入任何内容)。

请重新考虑。唯一比
import*
更糟糕的是magic
import*

如果你真的想:

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

潜在的问题是,我正在开发一些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())

就我们的目的而言,这很好。

我没有找到一个好方法,所以我从


在您的案例中,您似乎还可以在模块的字典上使用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))

这是我为Django动态命名本地设置文件的解决方案。请注意,下面添加了一个检查,以不包括导入文件中包含“_u”的属性。正在使用本地设置文件的模块名覆盖
\uu名称\uuuuuuuu
全局,这导致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)

@约翰·米利金:但如果一个模块定义了所有你应该遵守的内容,那么它就是迂腐的,如果没有“全部”,那么只会导入不以a开头的名称。你是对的:这是令人发指和邪恶的。。。非典型。我要求的原因不是包括任何常规的Python模块,而是包括一组短配置模块中的一个,这些模块会发生变化,具体到所使用的计算机(顺便说一句,这些模块没有全部定义)。我正在围绕这一点进行重构。:)@BMH:您是否考虑过像Django中使用的设置聚合器?定义一个存储要搜索的模块列表的对象,然后重写getattr以使用getattr()对其执行搜索。是的,绝对没有理由让每个设置都位于全局命名空间中,即
选项。某些\u选项
明显优于
某些\u选项
。在您的特定情况下,您还可以对模块的distionaries使用dict.update()。我可以看到这段代码的来源,但对exec的调用让我不寒而栗。我真的不知道在这种情况下这是否有什么大不了的,但我已经学会了相信我的直觉。这在函数内部是非法的,看起来确实很糟糕。
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)