看起来我错过了什么。
使用Jython在Java中运行我的Python代码时,会生成Java字节码文件(test.py - > test@py.class)。
我可以直接使用java运行这些类吗?
换句话说,我想这样做:
$ java test@py [additional cp args]
的工作。
意图:编写Python代码而不必泄露源代码。
答案 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)
请注意,jythonc
为no 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)