2016-07-05 39 views
0

我有一個Python模塊auth.py Python函數:的Java調用使用PythonInterpreter

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

每次我打電話的代碼我得到一個NameError形成參數(鍵名),我嘗試傳遞給Python代碼。

任何人都知道我在做什麼錯?

+2

可能引號缺失?如果你的代碼看起來更像是'getKeysByName(abc)',那麼Java調用你會做'getKeysByName(「abc」)''。 – Thomas

+0

井名在我的jav代碼中是可變的,對不起,如果不清楚。我已經把它也放在代碼 – Gobliins

+0

中,但我認爲你是對的,你可以把它作爲答案 – Gobliins

回答

1

根據要求作爲一個答案:)

傳遞一個鍵與值abceval("auth.get_keys_by_name(" + keyname+ ")")我的評論會導致對auth.get_keys_by_name(abc)進行評估,即解釋器可能會查找名爲的變量0,因爲這不存在,你得到一個NameError

添加引號(我不是Python專家,所以我不知道單引號還是雙引號會更好)應該修復該問題,即eval("auth.get_keys_by_name(\"" + keyname + "\")")將評估auth.get_keys_by_name("abc")

+0

對於「我應該使用單引號還是雙引號」的Python答案是「哪一個讓你的生活更輕鬆」(即,需要更少的轉義), 一般來說。國際海事組織,當你將Python代碼嵌入到其他語言的代碼中時,這仍然是正確的。 :) –

1

我認爲你的問題是python解釋器是在python程序中將java變量keyname解釋爲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+ "')");