在Python 2.7中是否可以接受用戶輸入並使用它來確定哪個模塊被加載?我可以從Python 2.7中的基於raw_input的模塊導入嗎?
我想是這樣的:
userModule = raw_input("Which module to import? ")
from userModule import *
那裏沒有叫userModule已有的模塊...
目前這款返回:導入錯誤:沒有模塊名爲userModule
在Python 2.7中是否可以接受用戶輸入並使用它來確定哪個模塊被加載?我可以從Python 2.7中的基於raw_input的模塊導入嗎?
我想是這樣的:
userModule = raw_input("Which module to import? ")
from userModule import *
那裏沒有叫userModule已有的模塊...
目前這款返回:導入錯誤:沒有模塊名爲userModule
使用importlib
模塊,有點globals()
詭計:
import importlib
userModule = raw_input("Which module to import? ")
mod = importlib.import_module('signal')
names = mod.__all__ if hasattr(mod, '__all__') else dir(mod)
g = globals()
for name in names:
g[name] = getattr(mod, name)
del g, name, names, mod, importlib
請注意,這不是最簡單和最直接的任務,您可能需要重新考慮這樣做的智慧。
一種解決方案是使用__import__
功能:
userModuleName = raw_input("Which module to import? ")
try:
userModule = __import__(userModuleName)
except ImportError:
print "could not import", userModuleName
這與'from modulename import *'不同,它會將'modulename'提供的所有東西都導入到本地命名空間中。 –
啊,公平點。並採取了。這是將'userModule .__ dict__'中的所有內容放入全局變量中的額外步驟。雖然,如果可以避免的話,我會針對來自運行時命名模塊的'import *'提出建議。在運行時導入某個模塊已經夠糟糕的了。不要通過導入'*'來複合它' – Nate
我完全同意最後一點,根本不需要這麼做*。然而,這個腳本大概已經在本地終端上運行了,所以無論是誰在運行它,都不會比通過簡單地打開python解釋器已經可以做的更糟糕。 :-) –
嗯,我本來這個想法醞釀快速原型的東西......但它決不是必不可少的(甚至是可取的)功能,讓我會停止鞭打這隻死馬,並回去做我應該做的事 –