1

ユーザーが使用可能な演算子を使用して関数を定義する、Mathwork の Simulink や Tanner-Spice によく似たシステムを構築しています。次に、その関数を実行して、ユーザーに応答を返す必要があります。UI インタラクションに Javascript を使用しています。内部的に、ユーザー定義関数 (UDF) は JSON としてキャプチャされ、この JSON を解析する Python サーバーに渡されます。

私の問題は、この UDF を実行する方法です。私のユーザーはすべて信頼できるユーザーなので、悪意のあるユーザーがこの機能を悪用してハッキングする心配はありません。

私が考えた 1 つの方法は、UDF を Python スクリプトとしてディスクに書き込んでから、commands.getstatusoutput() を実行することでした。ここでの問題は、関数が複数の入力を期待する可能性があり、それらを渡すことができないことです。

私が探しているのは、新しい python ファイルとその関数を動的にロードし、それらを呼び出すことができる機能です。


これを行う方法を説明するブログ投稿を見つけました。問題は、検索に適切なキーワードを使用していなかったことだと思います。

とにかく、ここの David Janes のブログでは、Python スクリプトを動的にロードする方法が説明されています。

私が望んでいたことを行うためのより良い方法があれば、コメントして提案することを引き続きお勧めします.

ありがとう、ニック

4

3 に答える 3

1

コード文字列、ファイル、またはコード オブジェクトからモジュールのようなオブジェクトを作成する単純なクラスを次に示します。

class DynamicModule(object):
    def __init__(self, code):
        exec code in self.__dict__

使用例:

>>> mod = DynamicModule("""
... def foo(x, y):
...     print x**2 + y
... """)
>>> 
>>> mod.foo(10, 20)

/tmp/hello.pyファイルの例 (という関数が含まれていると仮定hello):

>>> mod2 = DynamicModule(open('/tmp/hello.py'))
>>> mod2.hello('World')
Hello, World!
于 2012-08-27T01:14:20.080 に答える
0

exec入力が信頼されているので、これにモジュールを使用できます。

execドキュメント:http ://docs.python.org/reference/simple_stmts.html#exec

ドキュメントの抜粋:

This statement supports dynamic execution of Python code. The first expression should evaluate to either a string, an open file object, or a code object. If it is a string, the string is parsed as a suite of Python statements which is then executed (unless a syntax error occurs). [1] If it is an open file, the file is parsed until EOF and executed. If it is a code object, it is simply executed. In all cases, the code that’s executed is expected to be valid as file input (see section File input).

ただし、使用するときは、関数の外部でまたはステートメントをexec使用できないことに注意してください。returnyield

例:

your_json_data="def example(arg1,arg2):    print arg1,arg2"
exec(your_json_data)
example("Hello","World")
##Output: "Hello World"
于 2012-08-26T19:48:02.863 に答える
0

にある固定名の Python ファイルをインポートするにはsys.path:

import mod # it can import mod.py file

result = mod.some_function(*args)

名前が文字列の場合にモジュールをインポートするには:

import importlib

m = importlib.import_module("mod")
result = m.some_function(*args)

モジュールのコンテンツが文字列になっている場合:

ns = {}
exec """

def some_function(a, b):
    return a + b

# other functions, classes or any code
""" in ns

result = ns['some_function'](1, 2)
print result # -> 3

入力を完全に制御しない場合は、制限された環境で上記のコードを実行する必要があります。たとえば、サンドボックス化された pypy インタープリターに文字列を送信できます。

Python は Python を解析できます

安全な方法でコードを解析および操作するのに役立つastモジュールがあります。例: Evaluating a Math Expression in a string

于 2012-08-27T02:35:02.693 に答える