Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java使用PythonInterpreter调用Python函数_Java_Python_Jython - Fatal编程技术网

Java使用PythonInterpreter调用Python函数

Java使用PythonInterpreter调用Python函数,java,python,jython,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

我有一个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+ ")");
String keyname=“somename”
explorer.exec(“from services.framework import auth”);
列表键=(列表)解释器
.eval(“通过名称(“+keyname+”)获取密钥的授权”);
每次调用代码时,我都会从试图传递给python代码的参数(keyname)中得到一个NameError


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

我认为您的问题在于python解释器将java变量keyname解释为python程序中的python变量,而不是字符串。在keyname周围添加引号,您将不会得到此错误。我想换个词

而不是使用:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name(" + keyname+ ")");
List key=(List)解释器
.eval(“通过名称(“+keyname+”)获取密钥的授权”);
使用以下命令:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name('" + keyname+ "')");
List key=(List)解释器
.eval(“通过名称(“+keyname+”)获取密钥的身份验证”;

我认为您的问题在于python解释器将java变量keyname解释为python程序中的python变量,而不是字符串。在keyname周围添加引号,您将不会得到此错误。我想换个词

而不是使用:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name(" + keyname+ ")");
List key=(List)解释器
.eval(“通过名称(“+keyname+”)获取密钥的授权”);
使用以下命令:

List<String> keys = (List<String>) interpreter
            .eval("auth.get_keys_by_name('" + keyname+ "')");
List key=(List)解释器
.eval(“通过名称(“+keyname+”)获取密钥的身份验证”;

根据请求,我的评论作为回答:)

将值为
abc
的键传递给
eval(“auth.get\u keys\u by\u name(“+keyname+”)”)
将导致计算
auth.get\u keys\u by\u name(abc)
,也就是说,解释器可能会查找名为
abc
的变量,并且由于该变量不存在,因此会出现
name错误


添加引号(我不是python专家,所以我不知道单引号还是双引号更好)应该可以解决这个问题,即
eval(“auth.get\u keys\u by\u name(\”“+keyname+“\”)
将评估
auth.get\u keys\u by\u name(“abc”)
根据请求,我的评论作为答案:)

将值为
abc
的键传递给
eval(“auth.get\u keys\u by\u name(“+keyname+”)”)
将导致计算
auth.get\u keys\u by\u name(abc)
,也就是说,解释器可能会查找名为
abc
的变量,并且由于该变量不存在,因此会出现
name错误


添加引号(我不是python专家,所以我不知道单引号还是双引号更好)应该可以解决这一问题,即
eval(“auth.get\u keys\u by\u name(\”“+keyname+”)
将评估
auth.get\u keys\u by\u name(“abc”)
可能缺少引号?如果它是一个Java调用,那么您可以执行类似于
getKeysByName(“abc”)
的操作,而您的代码看起来更像
getKeysByName(abc)
。在我的jav代码中,名称是可变的,如果不清楚的话,很抱歉。我也把它写在代码里了,但我认为你是对的,你可以把它作为答案写出来,也许引号不见了?如果它是一个Java调用,那么您可以执行类似于
getKeysByName(“abc”)
的操作,而您的代码看起来更像
getKeysByName(abc)
。在我的jav代码中,名称是可变的,如果不清楚的话,很抱歉。我在代码中也提到了这个问题,但我认为你是对的,你可以把它作为答案。Python对“我应该使用单引号还是双引号”的回答通常是“让你的生活更轻松的那个”(即,需要更少的转义)。在我看来,当您将Python代码嵌入到其他语言代码中时,这仍然是正确的Python对“我应该使用单引号还是双引号”的回答通常是“使您的生活更轻松的那个”(即,需要更少的转义)。在我看来,当您将Python代码嵌入到其他语言代码中时,这仍然是正确的