자바 로 Python:Jython 디 딤 노트 실행

16716 단어 python자바runtime
일반적인 자바 호출 python 스 크 립 트 방식
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

좋은 웹페이지 즐겨찾기