“ import * from module”に相当する方法Pythonの__import__関数を使用しますか?

StackOverflow https://stackoverflow.com/questions/147507

  •  02-07-2019
  •  | 
  •  

質問

モジュール名の文字列を指定すると、モジュール内のすべてを、呼び出した場合と同様にどのようにインポートしますか:

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のローカル設定ファイルの動的な命名のための私のソリューションです。インポートされたファイルから「__」を含む属性を含めないようにするために、以下のチェックに注意してください。 __ 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)

根本的な問題は、いくつかの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))

良い方法が見つからなかったので、からよりシンプルでbutい方法を取りました。 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top