파이썬은 파이썬 버전 별로 다수의 서브 버전이 존재하며, 엄청난 수의 패키지를 만들고 공유하고있다. 또 이런 패키지들은 개별적인 버전들을 갖고 있다.
만약 컴퓨터 한대에서 여러개의 프로젝트를 만들어서 프로그램을 돌릴경우, 파이썬 애플리케이션의 런타임 버전과 라이브러리 충돌이 일어나면 문제가 발생할 것이다.
이 문제가 발생하는 이유는 파이썬 버전과 라이브러리 패키지 등이 전역적으로 설치되어서 사용되기 때문이다.
이를 해결하기 위하여 파이썬은 각각 애플리케이션 별로 독립적인 환경을 만들어줘야한다.
파이썬 가상 환경을 구성하기 위해서는 여러가지 툴이 필요하다.
1. virtualenv : python2 부터 사용하던 가상환경 라이브러리
2. venv : python 3.3 이후부터 기본 모듈
3. pyenv : Python Interpretor Version Manager
4. conda : Anaconda Python 설치했을 때 사용할 수 있다.
5. etc : virtualenvwrapper, buildout ...
먼저 [1.virtualenv]와 [2.venv]로 가상환경을 구성하는 법에 대해서 알아보았다.
✔ 1. virtualenv로 가상환경 구성하기
1, 설치
원래 python의 모듈 실행은 python3 -m pip 이렇게 해야하는데, 스크립트 제공해줘서 pip3 or pip로 사용할 수 있다.
상위로 위치를 옮기기 : # cd
virtualenv 설치하기 : # pip3 install virtualenv
2, 프로젝트 생성
# cd dowork/ - 나의 project들을 관리 디렉토리
# mkdir python-projects - python project를 관리하는 디렉토리 생성하기
# cd python-projects - 디렉토리로 들어가기
# mkdir loganalysis - loganalysis라는 이름의 python project 생성하기
3, 가상환경 생성
# cd loganalysis - 프로젝트로 들어가기
# virtualenv venv - 가상환경 만들기
: 전역에 있는 파이썬을(/cafe24/python3.7/) 우리 프로젝트에 venv라는 디렉토리 밑으로 복사한다.
4, 가상환경 구동
# source venv/bin/activate
5, 가상환경 확인
(venv) # python --version
가상환경이 실행되면 제일 앞에 (가상환경이름) 이 붙게된다.
6, 가상환경 나가기 : # deactivate
가상환경일 경우 python3.7.3. 버전을 사용하고,
가상환경을 나오면 전역으로 사용하는 python2.6.6을 사용하게 된다.
./configure 은 인스톨 하기 위한 환경을 설정하는 것
--prefix={경로} 는 컴파일 된 프로그램을 설치하는 위치
3, 컴파일 및 설치
# make
# make install
4, 공유 라이브러리 자동 로딩 설정
libressl을 공유라이브러리에 설정해줘야한다.
⭐ 잠깐! 공유라이브러리란!?!?
공유 라이브러리는 프로그램이 시작할때 적재되는 라이브러리이다.
공유 라이브러리가 제대로 설치된다면, 그다음에 시작하는 모든 프로그램은 자동적으로 새 공유 라이브러리를 사용한다.
프로그램들은 일반적으로 필요한 기능 중 특정 기능이 이미 구현되어 있으면 그 기능이 구현된 파일을 메모리에 올린 후 그 기능을 사용하게 된다.
이처럼 한 프로그램이라 하더라도 일반적으로 사용되는 여러 기능이 내부에서 다른 so 파일들을 통해서 이루어 지게 된다.
공유라이브러리와 연결된 프로그램을 실행하면 내부적으로 dynamic loader 프로그램이 먼저 동작해서 아래의 순서를 진행한다.
1, dynamic link된 공유 라이브러리 찾아 메모리에 로딩
2, entry function을 찾아 호출
3, 프로그램 실행
linux에서 공유라이브러리 로더 이름은 ld.so이다. 여기서 so는 shared object라는 뜻이다.
so 파일을 찾는 경로 설정은 일반적으로 3가지로 할 수 있다.
1. system default 경로
2. LD_LIBRARY_PATH
3. binary code 에 hard-coding 된 경로
1. system default
> 일반적으로 /usr/local/bin 과 /usr/bin 이다. 이 값은 /etc/ld.so.conf 파일에 설정이 된 값이다.
> 만약 내가 어떤 프로그램을 만들었고, 그것을 내 프로그램이 설치된 경로 밑의 lib 경로에 넣고 그것을 ld.so.conf 에 넣고 싶으면, /etc/ld.so.conf.d/ 경로 밑에 *.conf 파일 이름으로 저장 후 그 파일에 그 경로를 집어 넣으면 된다.
2. LD_LIBRARY_PATH - 환경변수 -> 권장되는 방법은 아님
/etc/profile파일에 아래 추가
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/ssl/lib
3. binary code 에 hard-coding 된 경로(매우 드문 경우)
> 개발자가 아예 소스코드에 so파일 경로를 설정해 버린 경우이다.
> 개발자가 직접 hard-coding한 경로에 so파일을 가져다 놓으면 된다.
나는 [1. system default 경로]로 설정을 해주었다.
먼저 2번 빌드환경 설정하기에서 --prefix={경로}로 지정해준 디렉토리로 들어가야한다.