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


117

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


3
비슷한 질문을 살펴보고 답을 읽으십시오. bytes.com/topic/python/answers/…
AlexR

답변:


101

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);

JYthon을 설치했거나 설치했다고 가정하고 설명한 코드를 계속 실행하려고했지만 실수로 강조 표시했습니다. Jython을 설치하려면 python 또는 java 폴더의 특정 폴더로 이동해야합니까?
Shahab

2
난 그냥 넷빈즈에 자이 썬을 통합 힘든 시간을 보내고있어, 어떤 오류가 발생하지 않습니다
샤 하브

오류가 없으면 작동하므로 분명히 그렇지 않습니다.) "오류"는 런타임 오류를 의미하지 않으며 컴파일 오류 일 수도 있습니다.
Voo

내 안타깝게도 그 단어를 잘못 사용했습니다. 내 프로젝트와 netbeans에 jython.jar을 추가하려고했습니다. 나는 그것을 알아 냈다
Shahab

1
Python 2 수명 종료는 1.1.2020이며 Jython은 Python 2.7 만 지원합니다. 따라서 기본적으로 죽은 자이 썬은 없습니다. 최상 (간단한) 옵션은 JEP의 lib 디렉토리
garyee

63

이봐, 늦었어도 대답을 입력하겠다고 생각했다. 자바와 파이썬을 얼마나 강력하게 연결하고 싶은지 먼저 고려해야 할 몇 가지 중요한 사항이 있다고 생각합니다.

첫째로 함수 만 호출하고 싶습니까, 아니면 실제로 파이썬 코드가 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가 손상됩니다. 그리고 나는 알고있다. 이것이 신맛이 날 수있는 많은 방법이 있습니다. 따라서 각 작업을 블록별로 완료해야합니다. 그런 다음 함께 모으십시오.


2
여기에 파이썬 스크립트를 한 번 작성하고 런타임에 사용할 통합 방법 (Jython, Jep 및 Py4j를 통한 CPython)을 결정할 수있는 라이브러리가 있습니다. github.com/subes/invesdwin-context-python 각 방법에는 고유 한 장점 / 단점이 있기 때문에
subes

@subes 그 프로젝트는 멋져 보입니다. 나는 그것을 찬성 할 답변을 작성하는 것이 좋습니다. 나는 그것이 Google 검색 외부에서 많은 유용한 정보를 제공하지 않는다고 생각하기 때문에 최고의 답변 haha를 싫어합니다.
Snickers3192

나는 별도의 답안 작성
subes

3
이 대답은 "이것이 받아 들여진 대답이어야합니다"라는 냄새가나요? 아니면 그냥 나입니까? ;-)
Mauricio Gracia Gutierrez

18

자바 내부에 파이썬 코드가있는 것은 현명하지 않습니다. 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


+1,하지만 양쪽 끝에서 앞뒤로 메시지를 만들고 구문 분석하는 추가 성능 및 통신 오버 헤드는 어떻습니까?
stx

예, 최소 입력 / 출력이 필요한 API 인터페이스를 정의해야합니다. 네트워크에서 클라이언트 / 서버간에 많은 데이터 전송을하는 것은 현명하지 않습니다. 이러한 인터페이스를 정의 할 수 없다면이 디자인 방식은 적합하지 않습니다.
Peiming Hu

10

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


8

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

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

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


이 프로젝트에는 릴리스가 없습니다.
Christian Schlichtherle

@ChristianSchlichtherle invesdwin-context-python 버전 1.0.0을 사용할 수 없습니다. 이 작은 보석 덕분에 : github.com/loewenfels/dep-graph-releaser
subes

6

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

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

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


5

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


5

GraalVM 은 좋은 선택입니다. 마이크로 서비스 설계를 위해 GraalVM과 Java + Javascript 조합을 수행했습니다 (Javascript 리플렉션 포함). 그들은 최근에 파이썬에 대한 지원을 추가했습니다. 특히 몇 년 동안 커뮤니티가 얼마나 커 졌는지에 대해 시도해 보겠습니다.


4

Java Native Interface를 사용하여 Java 에서 모든 언어를 호출 할 수 있습니다.


6
그 자체로 c에서 호출 할 수있는 모든 언어입니다. python은 괜찮지 만 Jython은 실제로 훨씬 더 간단한 솔루션입니다 (또는 j6 +에서 PyInterpreter 사용). c에서 파이썬 함수를 호출하는 코드를 작성하는 것은 그리 쉬운 일이 아닙니다.
Voo

2

자이 썬에는 몇 가지 제한 사항이 있습니다.

여러 가지 차이점이 있습니다. 첫째, Jython 프로그램은 C로 작성된 CPython 확장 모듈을 사용할 수 없습니다. 이러한 모듈에는 일반적으로 확장명이 .so, .pyd 또는 .dll 인 파일이 있습니다. 이러한 모듈을 사용하려면 순수 Python 또는 Java로 작성된 동등한 모듈을 찾아야합니다. 이러한 확장을 지원하는 것은 기술적으로 가능하지만-IronPython은 지원합니다-자이 썬에서 지원할 계획은 없습니다.

Jython을 사용하여 Python 스크립트를 JAR 파일로 배포합니까?

Runtime 또는 ProcessBuilder를 사용하여 Java에서 Python 스크립트 (또는 bash 또는 Perl 스크립트)를 호출하고 출력을 Java로 다시 전달할 수 있습니다.

자바에서 bash 쉘 스크립트 실행

Java에서 명령 줄 실행

java runtime.getruntime () 명령 줄 프로그램 실행에서 출력 가져 오기


0

이것은 현재 옵션에 대한 꽤 좋은 개요를 제공합니다. 그중 일부는 다른 답변에서 명명되었습니다. Jython은 Python 3.x를 구현하기로 결정하고 다른 많은 프로젝트가 Python 측에서 나오고 java에 액세스하기를 원할 때까지 사용할 수 없습니다. 그러나 아직 이름이 지정되지 않은 이름을 지정하는 몇 가지 옵션이 있습니다. gRPC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.