개요
프로젝트를 진행하는 과정에서 자바에서 파이썬 스크립트를 실행시켜야 할 필요가 있었다.
파이썬 관련 환경 설정과 스크립트 실행 코드는 타 팀에서 작업을 작업해주셨다.
PythonScriptExecutor
아래는 자바에서 파이썬 스크립트를 실행시키기 위한 코드이다.
@Slf4j
@Component
@NoArgsConstructor(access = AccessLevel.NONE)
public class PythonScriptExecutor {
public static void execute() {
try {
// Python 스크립트 경로
String pythonScriptPath = "/path/python_script.py";
// Python 가상환경 활성화
String virtualEnvPath = "/path/bin/activate";
String command = "source " + virtualEnvPath + " && python " + pythonScriptPath;
// 외부 프로세스 실행
ProcessBuilder processBuilder = new ProcessBuilder("/bin/bash", "-c", command);
Process process = processBuilder.start();
// 프로세스가 완료될 때까지 대기
int exitCode = process.waitFor();
if (exitCode == 0) {
log.info("정상 종료");
} else {
log.debug("비정상 종료. Exited with error code: " + exitCode);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
하지만 파이썬 스크립트가 실행되지 않았고 로그를 확인해보니 waitFor 메서드의 반환값이 1이었다.
0은 성공적으로 종료됨을 나타내고, 1은 실패나 에러 상태를 나타낸다.
비정상 종료. Exited with error code: 1
해당 로그만으로는 정확한 원인을 알기 어렵기 때문에 에러 내용을 확인하기 위해 아래 코드를 추가했다.
@Slf4j
@Component
@NoArgsConstructor(access = AccessLevel.NONE)
public class PythonScriptExecutor {
...
// 프로세스의 에러 출력을 읽기
BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
String errorLine;
while ((errorLine = errorReader.readLine()) != null) {
log.debug(errorLine);
}
...
}
다시 실행 후 로그를 확인해보면 아래와 같이 나왔다.
Traceback (most recent call last):
File "/path/python_script.py", line 7, in
from selenium import webdriver
ModuleNotFoundError: No module named 'selenium'
ModuleNotFoundError: No module named 에러는 파이썬에서 의존하고 있는 모듈을 Import하지 못했을 때 발생하는 에러이다. 현재 selenium을 의존하고 있지만 selenium module을 찾을 수 없어서 import하지 못하고 있는 것이다.
원인
파이썬은 기본적으로 모듈을 전역으로 공유하게 되기 때문에 프로젝트별로 모듈을 관리하기 위해 가상환경을 생성하여 프로젝트별 모듈을 관리한다.
현재 파이썬 스크립트를 호출할 때에도 가상환경을 생성하고 있는데, 해당 가상환경에 필요한 모듈이 없다고 유추해 볼 수 있다.
파이썬 패키지 매니저인 pip를 사용해 selenium이 설치되어 있는지 확인해보자
$ pip show selenium
Name: selenium
Version: 4.9.0
Summary:
Home-page: https://www.selenium.dev
Author:
Author-email:
License: Apache 2.0
Location: /path/lib/python3.10/site-packages
Requires: certifi, trio, trio-websocket, urllib3
Required-by:
엇, 설치되어있다! 왜일까?
왜냐하면 현재 가상환경을 생성하지 않고 명령어를 실행했기 때문에 전역 모듈에서 selenium이 있는지 찾게된거다.
전역 Module에는 설치되어 있는 것을 확인했으니, 가상환경을 실행해서 확인해보자
$ source /path/bin/activate # 가상환경 실행
$ pip show selenium
WARNING: Package(s) not found: selenium
$ deactivate # 가상환경 종료
가상환경에는 selenium이 설치되어 있지 않았다. 아마 파이썬을 담당하신 분께서 가상환경을 생성하지 않고 패키지들을 설치하신 듯하다.
해결 방법
위에서 pip show를 사용했을 때처럼 가상환경에 패키지를 설치하기 위해서는 해당 가상환경을 실행 후 설치를 진행하면 된다.
$ source /path/bin/activate # 가상환경 실행
$ pip install selenium
$ pip show selenium
Name: selenium
Version: 4.9.0
Summary:
Home-page: https://www.selenium.dev
Author:
Author-email:
License: Apache 2.0
Location: /venv-path/lib/python3.10/site-packages
Requires: certifi, trio, trio-websocket, urllib3
Required-by:
$ deactivate # 가상환경 종료
아마 selenium 뿐 아니라 다른 패키지들도 설치되어 있지 않을 것이다. 위 에러 내용과 원인, 해결 방안을 정리해서 파이썬 담당자분께 전달드렸고 이후 문제없이 파이썬 스크립트를 실행할 수 있었다.
마무리
파이썬에 대해 전혀 몰랐는데, 이번 기회에 파이썬에 대해 알아보고 문제 해결까지 해 볼 수 있어서 즐거운 시간이었다.
요새 바쁘다보니 블로그를 자주 못쓰는데 앞으로 더 힘내서 정리하는 습관을 들여야겠다ㅠㅠ
회사 다니면서도 꾸준히 블로깅하시는 분들 리스펙!!!
참조