【问题标题】:running jython bytecode using java使用 java 运行 jython 字节码
【发布时间】:2011-02-04 16:58:07
【问题描述】:

我好像错过了什么。

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

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

换句话说,我想做这个:

$ java test@py [additional cp args]

工作。

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

【问题讨论】:

    标签: java python jython bytecode


    【解决方案1】:

    这对我有用:

    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
    

    【讨论】:

      【解决方案2】:

      如果您只关心在不泄露源代码的情况下分发您的应用程序,您可能需要查看 Windows 上的 cx_freezepy2exe 以及 Mac 上的 py2app 等工具。

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

      【讨论】:

      • 从混淆的角度来看,pypy 编译器可能是一个更好的选择。不幸的是,它很难使用。
      【解决方案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]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 1970-01-01
        • 2013-02-17
        • 1970-01-01
        相关资源
        最近更新 更多