在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解释器已经可以做的更糟糕。 :-) –
嗯,我本来这个想法酝酿快速原型的东西......但它决不是必不可少的(甚至是可取的)功能,让我会停止鞭打这只死马,并回去做我应该做的事 –