它看起來像我失去了一些東西。使用java運行jython字節碼
當使用Jython在Java中運行我的Python代碼時,會生成Java字節碼文件(test.py - > [email protected])。
我可以直接使用java運行這些類嗎?
換句話說,我想使這個:
$ java [email protected] [additional cp args]
工作。
意圖:編寫Python代碼,而不必放棄源代碼。
它看起來像我失去了一些東西。使用java運行jython字節碼
當使用Jython在Java中運行我的Python代碼時,會生成Java字節碼文件(test.py - > [email protected])。
我可以直接使用java運行這些類嗎?
換句話說,我想使這個:
$ java [email protected] [additional cp args]
工作。
意圖:編寫Python代碼,而不必放棄源代碼。
注意jythonc
是no longer supported:
jythonc也不能處理髮電機和難以調試和改進。目前的想法是爲jython本身添加功能以從py文件生成字節碼並運行這些靜態編譯的項目,而不是像jythonc那樣使Java類與基本Python代碼一樣工作。目前的想法運行如下:使用功能註釋指定靜態Java類型信息
靜態編譯擴展Java類 Python類的代理類,而Java接口或類
- 打開Python類到Java類從芯
- 刪除代碼,這只是有支持jythonc也
的例子表明特殊註釋爲在需要被顯示Python類的任何方法從Java IBLE:
class Simple(object):
@java
def __init__(self):
@java(String, String)
def firstWord(self, param):
return param.split(' ')[0]
這裏對我來說是什麼在起作用:
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
從混淆視角來看,pypy編譯器可能是更好的選擇。不幸的是,它很難使用。 – Antimony 2013-04-14 19:45:24