使用java运行jython字节码

使用java运行jython字节码,java,python,jython,bytecode,Java,Python,Jython,Bytecode,看来我错过了什么 使用Jython在Java中运行Python代码时,会生成Java字节码文件(test.py->test@py.class) 我可以直接使用java运行这些类吗 换言之,我想这样做: $ java test@py [additional cp args] 工作 目的:编写Python代码,而不必泄露源代码。请参阅 请注意,jythonc是: jythonc不处理生成器,很难调试和改进。当前的想法是向jython本身添加功能,从py文件生成字节码,并运行静态编译的项,而不是jy

看来我错过了什么

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

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

换言之,我想这样做:

$ java test@py [additional cp args]
工作

目的:编写Python代码,而不必泄露源代码。

请参阅

请注意,
jythonc
是:

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

  • 使用函数注释指定静态Java类型信息,将Python类转换为没有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]

如果您唯一关心的是在不泄露源代码的情况下分发应用程序,那么您可能希望查看Windows和Mac上的和等工具


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

以下是适合我的:

test\u p.py:

java -cp $JYTHON_HOME/jython.jar:. TestJ
def foo():
打印“从Python测试”
TestJ.java:

java -cp $JYTHON_HOME/jython.jar:. TestJ
import org.python.core.PyFrame;
导入org.python.core.PyFunctionTable;
导入org.python.util.PythonInterpreter;
公共类TestJ
{
公共静态void main(字符串[]args)
{
最终PythonInterpreter解释器=新PythonInterpreter();
explorer.exec(“导入系统”);
尝试
{
最终类clazz=Class.forName(“test_p$py”);
最终java.lang.reflect.Constructor
=clazz.getConstructor(String.class);
最终PyFunctionTable模块=(PyFunctionTable)构造函数。newInstance(“”);
最终java.lang.reflect.Method
=clazz.getDeclaredMethod(“foo$1”,
PyFrame.class,
org.python.core.ThreadState.class);
调用(模块,
(PyFrame)解释器.eval(“sys.\u getframe()”)。(PyFrame.class),
org.python.core.Py.getThreadState());
}
捕获(最终类NotFound异常e)
{e.printStackTrace();}
捕获(最终NoSuch方法例外)
{e.printStackTrace();}
捕获(最终实例化异常e)
{e.printStackTrace();}
捕获(最终非法访问例外e)
{e.printStackTrace();}
捕获(最终java.lang.reflect.InvocationTargetException e)
{e.printStackTrace();}
}
}
将test_p.py编译为test_p$py.class:

$JYTHON\u HOME/JYTHON$JYTHON\u HOME/Lib/compileall.py。
将test_p.py移开,以证明它没有被使用:

mkdir hidden
mv test_p.py hidden/
编译:

java -cp $JYTHON_HOME/jython.jar:. TestJ
javac-cp$JYTHON\u HOME/JYTHON.jar TestJ.java
测试:

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

java -cp $JYTHON_HOME/jython.jar:. TestJ
Python测试

从模糊处理的角度来看,pypy编译器可能是更好的选择。不幸的是,它很难使用。