Java 使用 PythonInterpreter 调用 Python 函数

Java calling Python function using PythonInterpreter

我有一个 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 代码的参数(键名)中得到一个 NameError。

有人知道我做错了什么吗?

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

而不是使用:

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+ "')");

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

将值为 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") .