使用java运行jython字节码

时间:2010-04-06 07:06:38

标签: java python jython bytecode

看起来我错过了什么。

使用Jython在Java中运行我的Python代码时,会生成Java字节码文件(test.py - > test@py.class)。

我可以直接使用java运行这些类吗?

换句话说,我想这样做:

$ java test@py [additional cp args]

的工作。

意图:编写Python代码而不必泄露源代码。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:3)

请参阅FAQ - Embedding Jython

请注意,jythoncno longer supported

  

jythonc不处理生成器,很难调试和改进。目前的想法是为jython本身添加功能,以便从py文件生成字节码并运行那些静态编译的项,而不是jythonc使Java类像基本Python代码一样工作的方法。目前的想法如下:

     
      
  • 使用函数注释将Python类转换为没有Java接口或类的Java类,以指定静态Java类型信息
  •   
  • 静态编译扩展Java类的Python类的代理类
  •   
  • 从仅支持jythonc
  • 的核心中删除代码   

该示例建议Python类中任何需要从Java可见的方法的特殊注释:

class Simple(object):
  @java
  def __init__(self):

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

答案 2 :(得分:0)

如果您唯一关心的是分发应用程序而不泄露源代码,那么您可能希望在Windows上查看cx_freezepy2exe以及Mac上的py2app等工具。

这些工具能够将.py文件编译为字节码。