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")
.
我有一个 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")
.