Java使用PythonInterpreter调用Python函数

时间:2016-07-05 07:42:47

标签: java python jython

我有一个python模块auth.py:

keys= {
    "s1": ["k1", "k2"],
    "s2": ["k1", "k2"]
}

def get_keys_by_name(name):
    return keys[name]

调用Java代码:

String keyname= "somename"
interpreter.exec("from services.framework import auth");
List<String> keys = (List<String>) interpreter
                .eval("auth.get_keys_by_name(" + keyname+ ")");

每次调用代码时,我都会从我尝试传递给python代码的参数(keyname)中获取NameError。

任何人都知道我做错了什么?

2 个答案:

答案 0 :(得分:1)

我认为你的问题是python解释器将java变量keyname解释为python程序中的Python变量而不是字符串。在键名周围添加引号,您将不会收到此错误。我换句话说

而不是使用:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name(" + keyname+ ")");

使用此:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name('" + keyname+ "')");

答案 1 :(得分:1)

根据要求,我的评论作为答案:)

将值abc的密钥传递给eval("auth.get_keys_by_name(" + keyname+ ")")会导致auth.get_keys_by_name(abc)被评估,即解释器可能会查找名为abc的变量,因为它不会'存在你得到NameError

添加引号(我不是python专家所以我不知道单引号还是双引号会更好)应该修复它,即eval("auth.get_keys_by_name(\"" + keyname + "\")")会评估auth.get_keys_by_name("abc")