2

私の 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)()

しかし、私のプログラムの多くの関数には引数を渡す必要があり、このメソッドの使い方がわかりません。もう1つのことは、私のプロジェクトの主な目的は、モジュール(.pyファイル)をフォルダーに追加し、インターフェイスのようなコマンドプロンプトを使用してメインのpythonプログラムで動的に実行することです。メインプログラムに変更はありません。

セキュリティに関するいくつかの欠点があるため、関数 exec を使用するかどうかはわかりません。

ありがとうございました。

4

1 に答える 1

1

私には2つの解決策があります。1 つと 1execeval。それらをベースとして使用して、独自のものを実装できます。

  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', ...]
    
于 2013-05-02T14:26:58.773 に答える