2017-10-27 10 views
1

私はPython + Javaの統合コードを書くためにこのリンクから書いたサンプルを取りました。Jython/JavaコードでPythonのパッケージパスを提供するには?

http://www.jython.org/jythonbook/en/1.0/JythonAndJavaIntegration.html 

コードは次のようになります。

package org.jython.book.interfaces; 

import org.jython.book.interfaces.JythonObjectFactory; 
import org.python.core.Py; 
import org.python.core.PyString; 
import org.python.core.PySystemState; 

public class Main { 

    public static void main(String args[]) { 

     String projDir = System.getProperty("user.dir"); 
     String rootPath = projDir + "/src/org/jython/book/interfaces/"; 
     String modulesDir = projDir + "/src/org/jython/book/interfaces/"; 

     System.out.println("Project dir: " + projDir); 

     PySystemState sysSt = Py.getSystemState(); 
     JythonObjectFactory factory = new JythonObjectFactory(sysSt, BuildingType.class, "Building", "Building"); 

     BuildingType building = (BuildingType) factory.createObject(); 

     building.setBuildingName("BUIDING-A"); 
     building.setBuildingAddress("100 MAIN ST."); 
     building.setBuildingId(1); 

     System.out.println(building.getBuildingId() + " " + 
      building.getBuildingName() + " " + 
      building.getBuildingAddress()); 
    } 

} 

このコードを実行すると、pythonモジュールが見つからないというエラーが発生します。私は.pyと.pycファイルを 'modulesDir'として提供されたパスの下に置いています。文献番号"the requested module must be contained somewhere on the sys.path";しかし、私はこのJavaプログラムからどのように設定できるのか分かりませんでした。誰か助けてもらえますか?

Project dir: /Users/eclipsews/PythonJava 
Exception in thread "main" ImportError: No module named Building 

答えて

0

こんにちは!

PySystemState.initializeメソッドを追加しました。ここでは、Pythonモジュールが利用できるプロジェクトのパスに初期化された "python.path"プロパティを明示的に提供しています。次のように

private static Properties setDefaultPythonPath(Properties props) { 

    String pythonPathProp = props.getProperty("python.path"); 
    String new_value; 

    if (pythonPathProp == null) { 
     new_value = System.getProperty("user.dir") + "/src/org/jython/book/interfaces/";  
    } 

    props.setProperty("python.path", new_value); 
    return props; 
} 

Properties props = setDefaultPythonPath(System.getProperties()); 
PySystemState.initialize(System.getProperties(), props, null); 

これは、正しい出力を生成する:

module=<module 'Building' from '/Users/eclipsews/PythonJava/src/org/jython/book/interfaces/Building$py.class'>,class=<class 'Building.Buildin 
g'> 
1 BUIDING-A 100 MAIN ST. 
関連する問題