developer tip

자바에서 Python을 호출 하시나요?

optionbox 2020. 8. 19. 07:59
반응형

자바에서 Python을 호출 하시나요?


자이 썬을 사용하여 자바 코드에서 파이썬 함수를 호출 할 수 있는지, 아니면 파이썬에서 자바 코드를 호출하기 위해서만 가능한지 궁금합니다.


Jython : 자바 플랫폼 용 Python- http ://www.jython.org/index.html

Jython을 사용하여 Java 코드에서 Python 함수를 쉽게 호출 할 수 있습니다. 파이썬 코드 자체가 자이 썬에서 실행되는 한, 즉 지원되지 않는 일부 c 확장을 사용하지 않습니다.

이것이 효과가 있다면 확실히 얻을 수있는 가장 간단한 해결책입니다. 그렇지 않으면 org.python.util.PythonInterpreter새로운 Java6 인터프리터 지원에서 사용할 수 있습니다 .

내 머리 꼭대기의 간단한 예-그러나 작동해야합니다. (간결성을 위해 오류 검사가 수행되지 않음)

PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("import sys\nsys.path.append('pathToModules if they are not there by default')\nimport yourModule");
// execute a function that takes a string and returns a string
PyObject someFunc = interpreter.get("funcName");
PyObject result = someFunc.__call__(new PyString("Test!"));
String realResult = (String) result.__tojava__(String.class);

늦었음에도 불구하고 이에 대한 내 대답을 입력 할 것이라고 생각했습니다. 자바와 파이썬을 얼마나 강력하게 연결하고 싶은지 먼저 고려해야 할 몇 가지 중요한 사항이 있다고 생각합니다.

첫째로 함수 만 호출하고 싶습니까, 아니면 실제로 파이썬 코드가 Java 객체의 데이터를 변경하기를 원합니까? 이건 매우 중요합니다. 인수를 사용하거나 사용하지 않고 일부 Python 코드 만 호출하려는 경우 그다지 어렵지 않습니다. 당신의 주장이 원시적이라면 더 쉽게 만들 수 있습니다. 그러나 Java 클래스가 Java 객체의 데이터를 변경하는 Python에서 멤버 함수를 구현하도록하려면 그렇게 쉽지 않거나 간단하지 않습니다.

둘째 로 우리는 cpython에 대해 이야기하고 있습니까, 아니면 자이 썬이할까요? 나는 cpython이 어디에 있다고 말할 것입니다! 나는 이것이 파이썬이 그렇게 쿨한 이유라고 주장 할 것입니다! 그러나 필요할 때 c, c ++에 액세스 할 수있는 높은 추상화가 있습니다. 자바에서 그것을 가질 수 있다고 상상해보십시오. 이 질문은 어쨌든 쉽기 때문에 자이 썬이 괜찮은지 물어볼 가치가 없습니다.

그래서 나는 다음과 같은 방법을 가지고 놀았고 쉬운 것부터 어려운 것까지 나열했습니다.

자바에서 자이 썬으로

장점 : 아주 쉽습니다. 자바 객체에 대한 실제 참조가 있습니다.

단점 : CPython 없음, 매우 느림!

자바의 자이 썬은 매우 쉽다. 그리고 이것이 정말로 충분하다면 훌륭하다. 그러나 그것은 매우 느리고 cpython이 아닙니다! cpython없이 살 가치가있는 삶은 그렇게 생각하지 않습니다! Java 객체에 대한 멤버 함수를 구현하는 파이썬 코드를 쉽게 가질 수 있습니다.

Pyro를 통해 Java에서 Jython에서 CPython으로

Pyro는 파이썬을위한 원격 객체 모듈입니다. cpython 인터프리터에 일부 객체가 있으며 직렬화를 통해 전송되는 객체를 보낼 수 있으며이 메서드를 통해 객체를 반환 할 수도 있습니다. jython에서 직렬화 된 Python 객체를 보낸 다음 해당 멤버의 데이터를 변경하는 일부 함수를 호출하면 Java에서 이러한 변경 사항을 볼 수 없습니다. 파이로에서 원하는 데이터를 다시 보내는 것을 기억하면됩니다. 이것은 cpython을 얻는 가장 쉬운 방법이라고 생각합니다! jni, jna, swig 또는 .... c 또는 c ++를 알 필요가 없습니다. 쿨 응?

장점 : cpython에 대한 액세스, 다음 방법만큼 어렵지 않음

단점 : 파이썬에서 직접 자바 객체의 멤버 데이터를 변경할 수 없습니다. 다소 간접적입니다 (jython은 중간 남자입니다).

JNI / JNA / SWIG를 통해 Java에서 C / C ++로 임베디드 인터프리터를 통해 Python으로 (부스트 라이브러리를 사용할 수 있습니까?)

이 방법은 심장이 약한 사람을위한 것이 아닙니다. 그리고 좋은 방법으로 이것을 달성하는 데 오랜 시간이 걸렸다 고 말할 수 있습니다. 이 작업을 수행하려는 주된 이유는 Java 객체를 완전히 제어하는 ​​cpython 코드를 실행할 수 있기 때문입니다. 파이썬 (말과 같은)으로 자바 (침팬지와 같은)를 시도하고 빵을 만들기 전에 고려해야 할 주요 사항이 있습니다. 먼저 당신이 프로그램을 위해 소등되는 인터프리터를 충돌하면! 그리고 동시성 문제에 대해 시작하지 마십시오! 또한 보일러의 할당량이 있는데,이 보일러를 최소화 할 수있는 최상의 구성을 찾았다 고 생각하지만 여전히 할당되어 있습니다! 그래서 어떻게해야할까요? C ++가 당신의 중개인이고, 당신의 객체는 실제로 C ++ 객체라는 것을 고려하십시오! 당신이 지금 그것을 알고 있다는 것이 좋습니다. 자바가 아닌 cpp에서와 같이 프로그램을 작성하십시오. 두 세계에서 액세스하려는 데이터와 함께. 그런 다음 swig라는 래퍼 생성기를 사용할 수 있습니다 (http://www.swig.org/Doc1.3/Java.html )을 사용하여 Java에 액세스 할 수 있도록하고 Java에서 System.load (여기에서 dll 이름)를 호출하는 dll을 컴파일합니다. 먼저이 작업을 수행 한 다음 어려운 부분으로 이동하십시오! 파이썬을 사용하려면 인터프리터를 삽입해야합니다. 먼저 Hello 인터프리터 프로그램이나 Embedding python in C / C 튜토리얼을 제안 합니다. 일단 그 일이 끝나면 말과 원숭이가 춤을 추게 할 시간입니다! [boost] [3]를 통해 C ++ 객체를 파이썬으로 보낼 수 있습니다. 나는 내가 당신에게 물고기를주지 않았고 단지 물고기를 찾을 수있는 곳을 당신에게 말한 것을 압니다. 컴파일 할 때주의해야 할 몇 가지 포인터입니다.

부스트를 컴파일 할 때 공유 라이브러리를 컴파일해야합니다. 그리고 jdk, 즉 jawt.lib, jvm.lib에서 필요한 항목을 포함하고 링크해야합니다 (애플리케이션을 시작할 때 경로에 클라이언트 jvm.dll도 필요합니다).뿐만 아니라 python27.lib 또는 무엇이든 boost_python-vc100-mt-1_55.lib. 그런 다음 Python / include, jdk / include, boost를 포함하고 공유 라이브러리 (dll) 만 사용합니다. 그렇지 않으면 boost가 손상됩니다. 그리고 나는 알고있다. 이것이 신맛이 날 수있는 많은 방법이 있습니다. 따라서 각 작업을 블록별로 완료해야합니다. 그런 다음 함께 모으십시오.


자바 내부에 파이썬 코드가있는 것은 현명하지 않습니다. Python 코드를 flask 또는 다른 웹 프레임 워크로 래핑하여 마이크로 서비스로 만듭니다. 자바 프로그램이이 마이크로 서비스를 호출 할 수 있도록합니다 (예 : REST를 통해).

저를 믿으십시오. 이것은 매우 간단하며 많은 문제를 해결할 수 있습니다. 그리고 코드는 느슨하게 결합되어 확장 가능합니다.


몇 가지 답변은 JNI 또는 JNA를 사용하여 cpython에 액세스 할 수 있다고 언급하지만 Java에서 cpython에 액세스하기위한 오픈 소스 라이브러리가 이미 있기 때문에 처음부터 시작하지 않는 것이 좋습니다. 예를 들면 :


다음은 Python 스크립트를 한 번 작성하고 런타임에 사용할 통합 방법 (Jep 및 Py4j를 통한 Jython, CPython / PyPy)을 결정할 수있는 라이브러리입니다.

https://github.com/subes/invesdwin-context-python

각 방법에는 링크에 설명 된대로 고유 한 장점 / 단점이 있기 때문입니다.


파이썬 함수가 무엇을 의미합니까? cpython 으로 작성된 경우 직접 호출 할 수 없습니다. JNI 를 사용해야 하지만 Jython 으로 작성된 경우 jython이 궁극적으로 Java 바이트 코드를 생성하므로 Java에서 쉽게 호출 할 수 있습니다.

이제 내가 cpython 또는 jython으로 작성되었다고 말할 때 python은 python이고 대부분의 코드는 cpython 또는 java에 의존하는 특정 라이브러리를 사용하지 않는 한 두 구현 모두에서 실행되기 때문에 의미가 없습니다.

Java에서 Python 인터프리터를 사용하는 방법 은 여기를 참조하십시오 .


요구 사항에 따라 XML-RPC 와 같은 옵션 이 유용 할 수 있으며 이는 프로토콜을 지원하는 모든 언어로 원격으로 함수를 호출하는 데 사용할 수 있습니다.


You can call any language from java using Java Native Interface


Jython has some limitations:

There are a number of differences. First, Jython programs cannot use CPython extension modules written in C. These modules usually have files with the extension .so, .pyd or .dll. If you want to use such a module, you should look for an equivalent written in pure Python or Java. Although it is technically feasible to support such extensions - IronPython does so - there are no plans to do so in Jython.

Distributing my Python scripts as JAR files with Jython?

you can simply call python scripts (or bash or Perl scripts) from Java using Runtime or ProcessBuilder and pass output back to Java:

Running a bash shell script in java

Running Command Line in Java

java runtime.getruntime() getting output from executing a command line program

참고URL : https://stackoverflow.com/questions/8898765/calling-python-in-java

반응형