“ import * from module”に相当する方法Pythonの__import__関数を使用しますか?
-
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