【问题标题】:Python - Creating a command line like interface for loading modules/functionsPython - 创建一个类似于命令行的界面来加载模块/函数
【发布时间】:2023-04-09 19:05:01
【问题描述】:

在我的 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 程序使用类似界面的命令提示符动态执行,我希望以最少的 if 执行此操作主程序可能没有变化。

我不确定是否使用函数 exec,因为它在安全方面存在一些缺点。

谢谢。

【问题讨论】:

  • 参数是文字吗?
  • “关于安全的缺点。” - 所以做很多事情,可能有机会练习实施idiot-proof解决方案吗?
  • @JanneKarila 并非总是如此。
  • @TheMerovingian 我明白你的意思,但是 exec 允许用户执行他们自己的代码,这在大多数情况下是没有生产力的,因为开发人员无法检查该代码。虽然可以事先检查(必要时进行清理)添加的模块。
  • @GrimReaper:当然。但是,为了争论,假设您必须为要运行的每段代码编写一个模块(例如X 模块)。编写X 检查以仅允许使用exec 处理那些特定的X 函数不是相同的工作量吗?

标签: python command-line interface module


【解决方案1】:

我有两个解决方案。一个是exec,一个是eval。您可以将它们作为实现您自己的基础:

  1. 这是一个粗略的解决方案,使用 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'>
    
  2. 如果你不想使用 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', ...]
    

【讨论】:

  • 谢谢。这是最接近我正在寻找的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多