진행 중인 electron 프로젝트에서 python코드 실행을 위해 python-shell을 사용한다. 배포 시에 유저의 PC에 python이 설치되어 있어야하며, 코드에서 사용하는 pandas나 기타 다른 패키지 등의 의존성 문제도 있어 이를 해결하여야만 했다.
먼저 답을 알려주자면, anaconda 가상환경을 사용하여, 해당 가상환경 자체를 패키징할 때 함께 포함시키면 된다.
간략하게 그림으로 나타내보면 위와 같다.
conda 파이썬 가상환경을 프로젝트 내에 구성한 뒤, 필요한 파이썬 패키지들을 설치하고 패키징 시에 포함시켜주면 해결된다. 그리고 python-shell의 python실행 경로를 프로젝트 내 conda 가상환경의 파이썬 실행파일의 경로로 교체해주면 배포 후에, 파이썬이 설치되지 않은 사용자도 모두 앱을 이용할 수 있게 된다.
이러한 결론을 얻게 된 과정을 한 번 정리해보고자 한다. 인터넷에 자료가 별로 없어 너무 많은 시간이 걸렸기 때문에, 나와 같은 어려움을 다른 사람이 겪지 않았으면 한다.
아래부터는 내가 문제를 풀어온 과정이기 때문에, 꼭 봐야할 필요는 없다! ㅎㅅㅎ
먼저 첫 번째로 생각한 방법은 설치 시에 유저에게 python 설치와 패키지 설치를 함께 진행할 수 있도록 하는 것이었다. 하지만, 한 번의 설치만으로 모든 설치가 완료되고, 일반 사용자의 PC에 로컬로 python이 설치되는 것이 과연 바람직한가라는 생각이 들어 다음 진행 방향으로 넘어갔다.
2번째로 생각한 것은, py2exe, nx_freeze 등의 파이썬 라이브러리를 통해서 하나의 exe를 만드는 것이었다. py2exe, nx_freeze 같은 라이브러리는 텍스트.py파일을 실행가능한 exe파일로 만들어주는 것이기 때문에, 잘 활용한다면 하나의 파이썬 런타임을 만들 수 있지 않을까?라는 생각이 들어 진행했었다. 하지만 결론은, 불가능...이었다.
위의 라이브러리들은 python으로 작성된 script를 exe로 만들어 실행가능하게 하는 것이었기 때문에, 만약 django나 flask로 내부에 서버를 구성했다면 django를 예로 들면 manage.py를 exe 실행파일로 만들어 통신할 수 있을 것이다.
하지만 나의 경우엔 모든 파일을 exe파일로 만들어서 실행하는 방법이 존재하긴 했다. 하지만 추후 확장성과 매번 작업해야 하는 번거로움 때문에, 이러한 방법 대신 더 좋은 방법을 찾고자 했다.
python 가상환경 라이브러리 중 표준 라이브러리에 탑재된 venv를 이용하여 python환경 그 자체를 패키지에 담아보고자 하는 생각이 시작이었다. 로컬에서 배포파일을 만들어 설치 후 사용 시엔 잘 작동했지만, 실제 파이썬이 설치되어 있지 않은 컴퓨터에 설치 시 python.exe를 찾지 못하는 문제가 생겼습니다. window의 경우 venv 명령어를 통해 가상환경 생성 시에 로컬에 설치된 python 경로를 home 환경변수로 가지도록 설정이 되어, 이러한 문제가 발생했습니다.
여러 방법을 찾던 중에, Anaconda를 이용한 가상환경이라면 python 그 자체를 가지기 때문에 가능하지 않을까라는 생각이 들어서 바로 적용해보았다.
드디어!
파이썬이 설치되지 않은 컴퓨터에서도 정상적으로 작동하는 것을 확인했다. 정말 하루 내내 찾아보고 적용해보고 힘든 과정을 거쳐 결국 방법을 얻어냈다.
python-shell을 쓴 부분을 다르게 변경해도 되지만, 모든 개발자와 협업을 해야 하고 기존에 작성된 부분이 상당히 컸기 때문에, 위와 같은 방법을 통해 최종 배포완료했다.
안녕하세요!! 포스팅 정말 잘 읽었습니다. 많은 도움이 되었습니다. 감사합니다!! 그런데 혹시 한가지만 여쭤봐도 될까요?
저같은 경우 아나콘다의 가상환경 폴더만 통째로 일렉트론 안으로 넣어서 함께 패키징 했고, 파이썬이 설치되어 있지 않은 pc 에서 코드가 실행되는 것을 확인했습니다. 그런데 어떤 경우에는 가상환경을 먼저 활성화하고, 파이썬 코드를 실행해야 오류 없이 실행되는 경우가 있더라구요. 혹시 글쓴이님은 파이썬 코드 실행 전에 아나콘다를 먼저 활성화하고 파이썬 코드를 실행하는 방식으로 진행하셨나요? 그렇게 진행한다면 가상환경 폴더 뿐만 아니라 아나콘다 설치 폴더 전체를 일렉트론 앱안으로 넣는 방식으로 진행해야 할까요?
저와 같은 문제를 고민하셔서 많은 공감이 되었네요ㅠㅠ
한가지 질문이 있는데, python-shell 을 실행하려면 배포 후 사용자의환경에 python 이 필요하게되지않나요..?
해당 방법은 유저의 피시에 anaconda가 설치돼 있어야 하는건가요?