2010-04-06 70 views
9

它看起來像我失去了一些東西。使用java運行jython字節碼

當使用Jython在Java中運行我的Python代碼時,會生成Java字節碼文件(test.py - > [email protected])。

我可以直接使用java運行這些類嗎?

換句話說,我想使這個:

$ java [email protected] [additional cp args] 

工作。

意圖:編寫Python代碼,而不必放棄源代碼。

回答

3

請參閱FAQ - Embedding Jython

注意jythoncno longer supported

jythonc也不能處理髮電機和難以調試和改進。目前的想法是爲jython本身添加功能以從py文件生成字節碼並運行這些靜態編譯的項目,而不是像jythonc那樣使Java類與基本Python代碼一樣工作。目前的想法運行如下:使用功能註釋指定靜態Java類型信息

  • 靜態編譯擴展Java類
  • Python類的代理類,而Java接口或類

    • 打開Python類到Java類從芯
    • 刪除代碼,這只是有支持jythonc也

    的例子表明特殊註釋爲在需要被顯示Python類的任何方法從Java IBLE:

    class Simple(object): 
        @java 
        def __init__(self): 
    
        @java(String, String) 
        def firstWord(self, param): 
        return param.split(' ')[0] 
    
    0

    如果你唯一擔心的是不放棄的源分發您的應用程序,你可能想看看的工具,如在Mac的Windows cx_freezepy2exepy2app

    這些工具能夠將.py文件編譯爲字節碼。

    +0

    從混淆視角來看,pypy編譯器可能是更好的選擇。不幸的是,它很難使用。 – Antimony 2013-04-14 19:45:24

    4

    這裏對我來說是什麼在起作用:

    test_p.py:

    def foo(): 
        print 'test from Python' 
    

    TestJ.java:

    import org.python.core.PyFrame; 
    import org.python.core.PyFunctionTable; 
    import org.python.util.PythonInterpreter; 
    
    public class TestJ 
    { 
        public static void main(String[] args) 
        { 
        final PythonInterpreter interpreter = new PythonInterpreter(); 
    
        interpreter.exec("import sys"); 
    
        try 
         { 
         final Class<?> clazz = Class.forName("test_p$py"); 
    
         final java.lang.reflect.Constructor constructor 
          = clazz.getConstructor(String.class); 
    
         final PyFunctionTable module = (PyFunctionTable)constructor.newInstance(""); 
    
         final java.lang.reflect.Method method 
          = clazz.getDeclaredMethod("foo$1", 
                PyFrame.class, 
                org.python.core.ThreadState.class); 
    
         method.invoke(module, 
             (PyFrame)interpreter.eval("sys._getframe()").__tojava__(PyFrame.class), 
             org.python.core.Py.getThreadState()); 
         } 
        catch (final ClassNotFoundException e) 
         { e.printStackTrace(); } 
        catch (final NoSuchMethodException e) 
         { e.printStackTrace(); } 
        catch (final InstantiationException e) 
         { e.printStackTrace(); } 
        catch (final IllegalAccessException e) 
         { e.printStackTrace(); } 
        catch (final java.lang.reflect.InvocationTargetException e) 
         { e.printStackTrace(); } 
        } 
    } 
    

    編譯test_p.py到test_p $ py.class :

    $JYTHON_HOME/jython $JYTHON_HOME/Lib/compileall.py . 
    

    移動test_p。PY閃開,以證明它沒有被使用:

    mkdir hidden 
    mv test_p.py hidden/ 
    

    編譯:

    javac -cp $JYTHON_HOME/jython.jar TestJ.java 
    

    測試:

    java -cp $JYTHON_HOME/jython.jar:. TestJ 
    

    輸出:

    test from Python