在我的 Python 项目中,我试图让界面有点像命令提示符,我可以在其中键入函数的名称,它就会被执行。 示例:
Prompt >>> run.check
Running function check....
Prompt >>> run.get
Running function get
在上面的示例中,当我键入 run.check 时,它应该运行一个名为 check 的函数,而 run.get 应该运行函数 get 等等。
现在我有一个使用 raw_input 的提示,我可以通过使用函数别名和函数名称的字典来执行命令,即,
COMMANDS = {'exit': sys.exit,
'hello': greet,
'option3': function3,
'option4': function4,
}
cmd = raw_input("Prompt >>> ")
COMMANDS.get(cmd, invalidFunction)()
但是我程序中的很多函数都需要传递参数给它,我不知道如何使用这个方法。 另一件事是,我的项目的主要目的是将模块(.py 文件)添加到文件夹中,然后使用类似界面的命令提示符与主 python 程序一起动态执行,如果可能不改变主程序。
我不确定是否使用函数 exec,因为它在安全方面存在一些缺点。
谢谢。
最佳答案
我有两个解决方案。一个使用 exec
,一个使用 eval
。您可以将它们用作实现您自己的基础:
这是使用 exec 执行命令并动态加载模块的粗略解决方案:
>>> class MyDict(dict): def __getitem__(self, name): # overwrite __getitem__ for access of unknown variables print 'name in self:', name in self if not name in self: # TODO: handle ImportError module = __import__(name) return module return dict.__getitem__(self, name) >>> d = MyDict(x = 1) >>> exec 'print x' in d name in self: True 1 >>> exec 'print os' in d # this loads the os module because the variable os is not defined name in self: False <module 'os' from '/usr/lib64/python2.7/os.pyc'>
如果您不想使用 exec:
>>> def exec_in_module(string): module, command = string.split('.', 1) module = __import__(module) try: return eval(command, module.__dict__) except SyntaxError: exec command in module.__dict__ return None >>> exec_in_module('os.listdir(".")') ['README.md', ...]
关于Python - 创建类似命令行的界面来加载模块/函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16337465/