2010-04-06 3 views
9

내가 누락 된 것 같습니다.자바를 사용하여 자이 썬 바이트 코드를 실행 중

자바에서 파이썬 코드를 실행하기 위해 자이 썬을 사용할 때 자바 바이트 코드 파일이 생성된다 (test.py -> [email protected]).

java를 사용하여 이러한 클래스를 직접 실행할 수 있습니까?

즉,이를 만들고 싶어 :

$ java [email protected] [additional cp args] 

일을.

의도 : 파이썬 코드를 작성하고 소스 코드를 제공 할 필요가 없습니다.

답변

3

FAQ - Embedding Jython을 참조하십시오. jythoncno longer supported입니다

하는 것으로 :

jythonc 발전기를 처리하고 디버그 어렵고 향상되지 않습니다. 현재의 생각은 자이 썬 자체에 기능을 추가하여 py 파일의 바이트 코드를 생성하고 기본 Python 코드처럼 작동하는 Java 클래스를 만드는 jythonc의 접근 방법보다는 정적으로 컴파일 된 항목을 실행하는 것이다. 자바 클래스로

  • 턴 파이썬 클래스를 Java 인터페이스 또는 클래스없이 정적 Java 형 정보
  • 정적
  • 컴파일을 자바 클래스
  • 를 확장 파이썬 클래스의 프록시 클래스를 지정하는 기능 주석을 사용하여 다음과 같이 현재의 생각은 실행 단지이 핵심에서
  • 제거 코드를 지원하는 jythonc

예는 마주가 될 필요가있는 파이썬 클래스의 모든 메서드에 대한 특별한 주석을 제안한다 자바에서 ible :

class Simple(object): 
    @java 
    def __init__(self): 

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

당신의 유일한 관심사는 소스를 제공하지 않고 응용 프로그램을 배포하는 경우, 당신은 Mac에서 cx_freezepy2exe Windows에서와 py2app 같은 도구를보고 할 수 있습니다.

이러한 도구는 .py 파일을 바이트 코드로 컴파일 할 수 있습니다.

+0

pypy 컴파일러는 아마도 난독 화 관점에서 더 나은 방법 일 것입니다. 불행히도, 사용하기가 매우 어렵습니다. – Antimony

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로 이동하십시오.평 비켜, 사용하지 않을 것 증명하기 :

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