[java] 자바에서 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없이 살 가치가있는 삶은 그렇게 생각하지 않습니다! 자바 객체를 위해 멤버 함수를 구현하는 파이썬 코드를 쉽게 가질 수 있습니다.

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도 필요합니다). 무엇이든 boost_python-vc100-mt-1_55.lib. 그런 다음 Python / include, jdk / include, boost를 포함하고 공유 라이브러리 (dll) 만 사용합니다. 그렇지 않으면 boost가 손상됩니다. 그리고 나는 알고있다. 이것이 신맛이 날 수있는 많은 방법이 있습니다. 따라서 각 작업을 블록별로 완료해야합니다. 그런 다음 함께 모으십시오.


답변

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

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

2020 년 3 월 24 일 업데이트 : @stx의 의견에 따르면 위의 접근 방식은 클라이언트와 서버 간의 대량 데이터 전송에 적합하지 않습니다. 내가 추천 한 또 다른 접근 방식은 다음과 같습니다. Rust (C / C ++도 괜찮습니다)로 Python과 Java를 연결합니다.
https://medium.com/@shmulikamar/https-medium-com-shmulikamar-connecting-python-and-java-with-rust-11c256a1dfb0


답변

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


답변

여기에 파이썬 스크립트를 한 번 작성하고 런타임에 사용할 통합 방법 (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 와 같은 옵션 이 유용 할 수 있으며 이는 프로토콜을 지원하는 모든 언어로 원격으로 함수를 호출하는 데 사용할 수 있습니다.