running jython bytecode using java

后端 未结 3 979
抹茶落季
抹茶落季 2020-12-16 02:21

It looks like I\'m missing something.

When using Jython to run my Python code in Java, Java bytecode files are generated (test.py -> test@py.class).

Can I ru

3条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-16 02:44

    Here's what works for me:

    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(); }
      }
    }
    

    Compile test_p.py into test_p$py.class:

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

    Move test_p.py out of the way, to prove it's not being used:

    mkdir hidden
    mv test_p.py hidden/
    

    Compile:

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

    Test:

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

    Output:

    test from Python
    

提交回复
热议问题