자바 로 Python:Jython 디 딤 노트 실행
1.Jython.jar 에서 제공 하 는 라 이브 러 리 구현 2.Runtime.getRuntime()을 통 해 프로 세 스 를 열 어 스 크 립 트 파일 을 실행 합 니 다.
1.Jython
Jpython 사용 시 버 전이 중요 합 니 다!대부분의 구 덩이 는 여기에서 나온다.이 말 을 듣 지 않 는 사람 은 시행 착 오 를 좀 더 걸 어야 한다
실행 환경:Python 2.7+Jython-standalone-2.7.0
<dependency>
<groupId>org.pythongroupId>
<artifactId>jython-standaloneartifactId>
<version>2.7.0version>
dependency>
1)Jython 이 Python 문 구 를 실행 합 니 다.
import org.python.util.PythonInterpreter;
public class HelloPython {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.exec("print('hello')");
}
}
2)Jython 파 이 썬 스 크 립 트 실행
import org.python.util.PythonInterpreter;
public class HelloPython {
public static void main(String[] args) {
PythonInterpreter interpreter = new PythonInterpreter();
interpreter.execfile("./pythonSrc/time.py");
}
}
3)Jython 이 Python 방법 을 실행 하여 반환 값 을 가 져 옵 니 다.
PythonInterpreter interpreter = new PythonInterpreter();
interpreter = new PythonInterpreter();
interpreter.execfile("./pythonSrc/fibo.py");
PyFunction function = (PyFunction)interpreter.get("fib",PyFunction.class);
PyObject o = function.__call__(new PyInteger(8));
System.out.println(o.toString());
fibo.py
# Fibonacci numbers module
def fib(n): # return Fibonacci series up to n
result = []
a, b = 0, 1
while b < n:
result.append(b)
a, b = b, a+b ·
return result
2.Jython 의 한계
Jython 은 일반 py 스 크 립 트 를 실행 할 때 속도 가 느 리 고 제3자 라 이브 러 리(requests,jieba...)를 포함 할 때 bug 가 많아 처리 하기 가 쉽 지 않 습 니 다.python 이 실 행 될 때의 sys.path 와 Jython 의 sys.path 경로 가 일치 하지 않 고 Jython 의 처리 가 좋 지 않 기 때 문 입 니 다.
python 실행 시:
['F:\\Eclipse for Java EE\\workspace\\Jython\\pythonSrc', 'F:\\Python27\\DLLs', 'F:\\Python27\\lib', 'F:\\Python27\\lib\\lib-tk', 'F:\\Python27', 'F:\\Python27\\lib\\site-packages', 'F:\\Python27\\lib\\site-packages\\unknown-0.0.0-py2.7.egg', 'F:\\Python27\\lib\\site-packages\\requests-2.18.4-py2.7.egg', 'F:\\Python27\\lib\\site-packages\\certifi-2018.1.18-py2.7.egg', 'F:\\Python27\\lib\\site-packages\\urllib3-1.22-py2.7.egg', 'F:\\Python27\\lib\\site-packages\\idna-2.6-py2.7.egg', 'F:\\Python27\\lib\\site-packages\\chardet-3.0.4-py2.7.egg', 'C:\\windows\\system32\\python27.zip', 'F:\\Python27\\lib\\plat-win']
Jython 실행 시:
['F:\\Maven\\repo\\org\\python\\jython-standalone\\2.7.0\\Lib', 'F:\\Maven\\repo\\org\\python\\jython-standalone\\2.7.0\\jython-standalone-2.7.0.jar\\Lib', '__classpath__', '__pyclasspath__/']
경로 문제 에 대해 우 리 는 두 가지 해결 방법 이 있 습 니 다.하 나 는 제3자 라 이브 러 리 경 로 를 수 동 으로 추가 하고 호출 하 는 것 입 니 다.
PySystemState sys = Py.getSystemState();
System.out.println(sys.path.toString());
sys.path.add("F:\\Python27\\Lib\\site-packages\\jieba");
둘째,제3자 라 이브 러 리 폴 더 를 실 행 된.py 스 크 립 트 동급 디 렉 터 리 에 두 는 것 이다.그리고 새로운 문제 가 왔 습 니 다.당신 은 경로 가 최종 적 인 문제 라 고 생각 합 니까?뿐만 아니 라 Python 의 버 전 문법 문제 일 수도 있 습 니 다.2x,3x 로 인해 Jython 으로 제3자 라 이브 러 리 를 포함 한.py 스 크 립 트 를 실행 할 때 각종 Module 이 존재 하지 않 습 니 다.원래 블 로 거 가 가 는 Jython 의 길 은 jieba 제3자 라 이브 러 리 도 다운 받 았 습 니 다.나중에 실 행 될 때 많은 오류 가 발생 했 습 니 다.jieba 라 이브 러 리 는 py3 에 대해 과도 적 인 지원 을 하 는 것 같 습 니 다.jython 은 이런 문법 형식 을 지원 하지 않 습 니 다.저 는 jieba 를 한 군데 또 한 군데 바 꾸 었 습 니 다.그래서 블 로 거 는 손상 을 입 은 후에 과감하게 Jython 을 포기 합 니 다!제3자 라 이브 러 리 의 python 을 사용 할 수 없 기 때문에 알 을 합 친다!
최종 방법 이 왔 습 니 다:아 날로 그 콘 솔 실행
public class Cmd {
public static void main(String[] args) throws IOException, InterruptedException {
String[] arguments = new String[] { "python", "./pythonSrc/time.py", "huzhiwei", "25" };
try {
Process process = Runtime.getRuntime().exec(arguments);
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = null;
while ((line = in.readLine()) != null) {
System.out.println(line);
}
in.close();
int re = process.waitFor();
System.out.println(re);
} catch (Exception e) {
e.printStackTrace();
}
}
}
time.py
#!/usr/bin/python
#coding=utf-8
#
def my_test(name, age):
print("name: "+str(name))
print(age) #str()
return "success"
#
#sys.argv[1] cmd
my_test(sys.argv[1], sys.argv[2])
실행 결과
name: huzhiwei
25
0
2 원 짜 리~이 방법의 한계 도 왔 습 니 다.python 개발 자 에 게 는 간단 합 니 다.직접 출력 하지만 python 모듈 은 한 가지 만 할 수 있 습 니 다.이 점 은 Python 단 이 자바 단 에 주 는 공개 인터페이스 와 같 습 니 다.Servlet 과 유사 하 죠?좋 은 점도 있 습 니 다.실수 하지 않 고 빨리 운행 합 니 다!망 설 이 는 학생 빨리 cmd 돌려~!
2018-4-19:
블 로 거들 은 cmd 가 Python 을 호출 할 때 일부 상황 을 만 났 는데 이런 문 제 는'시간 초과,차단'등 문제 원인 으로 분류 할 수 있다.
Process p=Runtime.getRuntime().exec(String[] cmd);
Runtime.exec 방법 은 로 컬 프로 세 스 를 만 들 고 process 하위 클래스 의 인 스 턴 스 를 되 돌려 줍 니 다.이 인 스 턴 스 는 프로 세 스 를 제어 하거나 프로 세 스 에 관 한 정 보 를 얻 을 수 있 습 니 다.Runtime.exec 방법 을 호출 하여 만 든 하위 프로 세 스 는 터미널 이나 콘 솔 이 없 기 때문에 이 하위 프로 세 스 의 표준 IO(예 를 들 어 stdin,stdou,stderr)는 p.getOutputStream(),p.getInputStream(),p.getErrorStream()방법 을 통 해 부모 프로 세 스 로 재 설정 합 니 다.사용 자 는 이 stream 을 사용 하여 하위 프로 세 스에 데 이 터 를 입력 하거나 하위 프로 세 스 의 출력 을 가 져 와 야 합 니 다.
예 를 들 어 Runtime.getRuntime().exec("ls")의 또 다른 관심 사 는 Runtime.getRuntime().exec()에서 정체(차단,blocking)가 발생 하 는 문제 입 니까?이것 은 Runtime.getRuntime().exec()가 stdout 과 stderr 의 출력 을 스스로 처리 해 야 하기 때 문 입 니 다.즉,실 행 된 결 과 는 기 존 오류 출력(stderr)인지 기 존 표준 출력(stdout)인지 모 릅 니 다.그 선 출력 을 판단 할 수 없 기 때문에 출력 을 읽 을 수 없 을 수도 있 고 계속 막 힐 수도 있 습 니 다.예 를 들 어 표준 출력(stdout)을 먼저 처리 하지만 처리 결 과 는 먼저 오류 출력(stderr)이 있 고 오류 출력(stderr)이 가 져 가 기 를 기 다 렸 다가 표준 출력(stdout)에 이 르 러 서 야 차단 이 생 겼 습 니 다.
해결 방법:
표준 출력(stdout)과 오류 출력(stderr)을 두 스 레 드 로 출력 합 니 다.
전체 코드:
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* Created by [email protected] 2018 4 19 1:50:06
*/
public class ExecuteCmd {
/** , */
public static String execute(String[] cmd, String... encoding) {
BufferedReader bReader = null;
InputStreamReader sReader = null;
try {
Process p = Runtime.getRuntime().exec(cmd);
/* " " , */
Thread t = new Thread(new InputStreamRunnable(p.getErrorStream(), "ErrorStream"));
t.start();
/* " " */
BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
if (encoding != null && encoding.length != 0) {
sReader = new InputStreamReader(bis, encoding[0]);//
} else {
sReader = new InputStreamReader(bis, "utf-8");
}
bReader = new BufferedReader(sReader);
StringBuilder sb = new StringBuilder();
String line;
while ((line = bReader.readLine()) != null) {
sb.append(line);
sb.append("
");
}
bReader.close();
p.destroy();
return sb.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
class InputStreamRunnable implements Runnable {
BufferedReader bReader = null;
public InputStreamRunnable(InputStream is, String _type) {
try {
bReader = new BufferedReader(new InputStreamReader(new BufferedInputStream(is), "UTF-8"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void run() {
String line;
int num = 0;
try {
while ((line = bReader.readLine()) != null) {
System.out.println("---->"+String.format("%02d",num++)+" "+line);
}
bReader.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
사용 시 이 도구 종 류 를 직접 호출 하면 됩 니 다.
다음으로 전송:https://www.cnblogs.com/yueshutong/p/9381570.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.