20

モジュール名の文字列が与えられた場合、次のようにモジュール内のすべてをどのようにインポートしますか?

from module import *

つまり、文字列 S="module" が与えられた場合、次の同等のものを取得するにはどうすればよいですか。

__import__(S, fromlist="*")

これは期待どおりに実行されないようです (何もインポートしないため)。

4

5 に答える 5

35

再考してください。魔法より悪いのimport *魔法 import *だけだ。

あなたが本当にしたい場合:

m = __import__ (S)
try:
    attrlist = m.__all__
except AttributeError:
    attrlist = dir (m)
for attr in attrlist:
    globals()[attr] = getattr (m, attr)
于 2008-09-29T04:45:07.447 に答える
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)
于 2010-07-20T03:16:33.197 に答える
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))
于 2009-08-29T09:30:01.560 に答える
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())

これは私たちの目的にはうまく機能します。

于 2008-10-02T02:33:33.477 に答える
-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
于 2008-11-15T22:55:08.893 に答える