使用java运行jython字节码

看起来我错过了一些东西。

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

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

换句话说,我想这样做:

$ java test@py [additional cp args] 

工作。

目的:编写Python代码而不必放弃源代码。

这对我有用:

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移开,以certificate它没有被使用:

 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 

请参阅常见问题 – 嵌入Jython 。

请注意, 不再支持 jythonc

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

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

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

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

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

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