티스토리 뷰
일단 나는 파이썬은 잘 알지 못한다.
아직은 배우고 싶은 생각도 없다.
하지만, 스프링과 파이썬을 연동해야하는 경우가 생겨버렸다.
어떻게 하면 연동하는 지에 대해 알아보자.
일단, REST API로 통신을 해서, 파이썬을 실행하는 방식으로 만들었다.
만약 RestController로, api/test 라는 걸로 통신했다고 예를 들어보자. RestController는 생략하겠다.
그리고 @Component 객체를 만들어줘야 한다.
PythonRunComponent.java 파일을 만들어주고, @Component 어노테이션을 붙여주자.
@Component
public class PythonRunComponent{
...
}
이런식으로 클래스를 만들어줬다면, 통신을 할 때 실행 할 메서드를 하나 만들어주자.
@Component
public class PythonRunComponent{
@Value("classpath:static/python/test.py")
private Resource pythonFile;
public String runPython(){
}
}
@Value 어노테이션 안에 있는 값은
src/main/resources/python 폴더 안에 있는 test.py 파일을
pythonFile에 가지고 있겠다라는 뜻을 가지고 있다.
그리고, REST API 통신을 실행하는 메서드에
PythonRunComponent 객체 안에 있는 runPython 메서드를 실행하도록 하기 위해
runPython이란 메서드를 만들어주었다.
그냥 test.py에, print("hello world") 라는 출력 함수 하나만 있다면, 저걸 어떻게 실행해서 Console창에 띄우거나 저 값을 받아올 수 있을까?
답은 ProcessBuilder다. ProcessBuilder 객체로, 명령 프롬프트 처럼 command를 날려서 python을 실행하게 하면 된다.
@Component
public class PythonRunComponent{
@Value("classpath:static/python/test.py")
private Resource pythonFile;
public String runPython(){
boolean isWindows = System.getProperty("os.name").toLowerCase().startsWith("windows");
String python;
python = isWindows ? "python" : "python3";
ProcessBuilder builder = new ProcessBuilder();
try{
builder.command(python, pythonResource.getFile().getAbsolutePath()).redirectErrorStream(true);
builder.directory(new File(System.getProperty("user.home")));
BufferedReader br = new BufferedReader(new InputStreamReader(process.getInputStream(), "utf-8"));
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
int exitCode = process.waitFor();
if(exitCode == 0){
return "success";
}
else{
return "fail";
}
}
catch(Exception e){
e.printStackTrace();
}
return "error";
}
}
이게 최종코드이다. 그러면 python 파일이 잘 실행이 될 것이다.
하지만 중요한 점도 있다. InputStreamReader에서, "utf-8"로 설정을 해줬는데도 글자가 깨져서 나오는 경우가 생긴다.
그러면 값을 line으로 받아와도 무용지물이 된다.
기존에 나와있는 python 파일의 인코딩 코드를 사용해도 글자는 깨져서 나온다.
그 방법은 밑에 링크로 남겨놨다.
해당 코드를 이용해서 잘 실행되기를 바란다.
Spring과 Python ProcessBuilder로 실행시 인코딩, 한글 깨짐 해결
ProcessBuilder로 스프링 내에서 Python을 실행해야하는 경우가 있을 수도 있다. 하지만 분석한 값을 return 받아보면 글자가 깨져서 나오는 경우가 있는데... java에서도 인코딩 해보고, python 파일에서도
includecoding.tistory.com
'web & develop > Spring' 카테고리의 다른 글
Poi 엑셀 양식 다운로드 쉽게 만들기 (1) | 2022.10.27 |
---|---|
[ JAVA ] ReplaceAll에서 정규표현식 특수문자 (0) | 2022.09.22 |
Spring Boot Maven 로컬 jar 파일 불러오기 (0) | 2022.08.02 |
Spring R 연동하기_1 ( Windows ) (0) | 2022.07.26 |
STS (Spring Tool Suite) 단축키 정리 끝판왕 ( + 추가중 ) (1) | 2022.04.29 |
- Total
- Today
- Yesterday
- 안드로이드
- 프로그래밍
- 프리젠테이션 로직
- 뷰포리아
- Unity
- JSP
- 게임프로그래밍
- Git
- GitHub
- 비지니스 로직
- unity3d
- Next.js
- 유니티3D
- Base Of Coding
- 유니티로 배우는 C#
- 스프링
- c#
- VR
- 유니티
- baseofcoding
- MVC
- Controller
- Spring
- HTML
- Vuforia
- Servlet
- 서블릿
- spring boot
- CSS
- Java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |