給定一個帶有模塊名稱的字符串,你怎麼在模塊中導入的一切,如果你曾呼籲:如何用Python的__import__函數完成「import * from module」的等價操作?
from module import *
即給定的字符串S =「模塊」,一個人如何得到下面的等價:
__import__(S, fromlist="*")
這似乎沒有按預期執行(因爲它不會導入任何內容)。
給定一個帶有模塊名稱的字符串,你怎麼在模塊中導入的一切,如果你曾呼籲:如何用Python的__import__函數完成「import * from module」的等價操作?
from module import *
即給定的字符串S =「模塊」,一個人如何得到下面的等價:
__import__(S, fromlist="*")
這似乎沒有按預期執行(因爲它不會導入任何內容)。
請重新考慮。唯一比import *
更差的是魔術import *
。
如果你真的想:
m = __import__ (S)
try:
attrlist = m.__all__
except AttributeError:
attrlist = dir (m)
for attr in attrlist:
globals()[attr] = getattr (m, attr)
根本的問題是,我開發一些Django的,但超過一臺主機(與同事),都具有不同的設置上。我希望做這樣的事情在工程/ 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())
這對我們的目的正常工作。
我沒有找到一個很好的辦法做到這一點,所以我花了一個簡單,但醜陋的方式從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
看來,你也可以在使用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的本地設置文件動態命名的解決方案。請注意,檢查下面的添加內容不包含導入文件中包含「__」的屬性。全局變量__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)
也許更好: 爲以米.__ all__ ATTR? – 2008-09-29 04:47:34
@Sergei:不能保證模塊會定義__all__ – 2008-09-29 04:55:13
@John Millikin:但是如果一個模塊定義__all__,你應該遵守它 – 2008-09-29 06:56:50