virtualenv를 사용하면 파이썬 런타임의 독립성을 한층 더 높일 수 있습니다. pyenv가 파이썬 버전을 관리하는 기능을 제공한다면, virtualenv는 파이썬 구동 환경을 관리합니다. pyenv를 이용하면 컴퓨터에 파이썬 버전 별로 1개의 파이썬 런타임을 설치하고 관리할 수 있습니다. virtualenv를 사용하면 파이썬 버전을 세분화하여 여러 개별 환경으로 구분하여 관리하는 기능을 제공합니다. 예를 들어서 python 3.5.2 런타임을 여러개 구성할 수 있고, 애플리케이션 별로 할당할 수 있습니다. 따라서, pyenv와 virtaulenv를 사용하면 매우 효과적입니다. 이러한 이유로 pyenv의 virtualenv 플러그인을 사용하는 것이 일반적입니다. pyenv-virtualenv 프로젝트는 https://github.com/yyuu/pyenv-virtualenv 에서 개발되고 있습니다.
pyenv-virtualenv 설치
pyenv-virtualenv는 OS별로 다음과 같이 설치할 수 있습니다.
macOS
pyenv-virtualenv 설치: homebrew
OS X는 homebrew를 이용하여 설치할 수 있습니다.
1
$ brew install pyenv-virtualenv
리눅스 pyenv-virtualenv 설치
pyenv를 pyenv-installer로 설치할 때 pyenv-virtualenv 설치가 포함됩니다. pyenv-installer로 pyenv가 설치되었다면 별도의 조치가 필요 없습니다.
pyenv로 virtualenv 생성
다음과 같은 명령으로 파이썬 환경을 구성합니다.
1
$ pyenv virtualenv <vertualenv-name>
은 생략 가능합니다. 버전을 생략할 경우 현재 시스템 버전으로 가상환경이 설정됩니다. virtualenv 플러그인으로 만든 가상환경인 경우 activate, deactivate 명령을 이용하여 활성화/비활성화합니다. 가상환경을 활성화/비활성화를 위해서는 다음 명령을 사용합니다.
1
$ pyenv activate <vertualenv-name>
가상환경 종료는 다음 명령을 사용합니다.
1
$ pyenv deactivate
가상환경을 삭제할 경우 다음과 같은 명령을 사용합니다.
1
$ pyenv uninstall <version>/<vertualenv-name>
버전을 설치해 봤으니 그 버전 위에 올라갈 virtualenv를 설치해보도록 하자. test라는 이름을 가진 virtualenv를 3.5.2버전 위에 설치해보자.
pyenv virtualenv [VERSION_NAME] [VIRTUALENV_NAME] 형식으로 입력해주면 된다.
1
$ pyenv virtualenv 3.5.2 test_virtualenv
1 2 3 4 5
$ pyenv versions
* system (set by PYENV_VERSION environment variable) 3.5.2 3.5.2/env/test_virtualenv
versions명령어로 3.5.2 위에 test_virtualenv라는 환경이 설치된 것을 확인할 수 있다.
쓰고있는 버전을 옮기려면 똑같이 shell 명령어를 사용하면 된다. activate명령어를 이용해도 된다.
1
$ pyenv shell[or activate] test
shell 명령어는 Python의 버전과 virtualenv에 모두 적용할 수 있는 명령어이고, activate 명령어는 virtualenv에만 사용이 가능하다. shell을 이용해서 다른 버전이나 virtualenv를 사용중이라면 pyenv shell system을 이용하여 기본 버전으로 되돌아올 수 있고, activate를 이용하여 virtualenv를 사용중이라면 pyenv deactivate를 이용하여 사용중인 virtualenv에서 나올 수 있다.
requirements.txt 생성
test를 하나의 Python 프로젝트라고 생각하자. 이곳에 프로젝트에 필요한 package들을 설치해야 한다. pip로 Django를 설치하고, freeze로 package들 목록을 추출해보자.
requirements.txt에 Django==1.10.1라고 현재 설치된 package가 적혀있다. 이는 pyenv파일에 독립적으로 설치된 package이고, 다른 virtualenv나 버전으로 옮기면 사용할 수 없게 된다. 이로써 의존성 관리 문제를 해결 하게 된 것이다.
다른 개발 환경에서 프로젝트에 설치된 패키지를 동기화하려면 virtualenv를 만들고, shell명령어로 사용 설정을 한 뒤에, requirements.txt파일을 받아서 다음과 같은 명령어를 입력한다.
1
$ pip install -r requirements.txt
requirements.txt라는 이름은 반드시 정해진 것이 아니라 package목록을 담는 파일이름으로 관습적으로 사용하는 것이다.
귀차니즘: autoenv
pyenv-virtualenv의 단점은 가상환경을 활성화하기 위해서 pyenv activate를 실행해야 한다는 것입니다. autoenv는 Python 프로젝트 진입시점시에 자동으로 virtualenv 환경 로딩하는 기능을 제공합니다. 가상 환경 활성화에 대한 귀차니즘을 없앨수 있습니다.
위에까지가 Python에만 종속되는 내용이었고, 이번에 설치할 autoenv는 Python뿐만 아니라 모든 명령어에 적용할 수 있다. 다음과 같은 명령어로 설치한다.
$ brew install autoenv 이번에도 .bash_profile에 설정을 해줘야한다. 다음과 같은 내용을 맨 밑에 넣어준다.
source $(brew –prefix autoenv)/activate.sh autoenv를 이용한 자동화
autoenv는 터미널에서 디렉토리에 접근할 시에, .env파일을 찾아서 그 내용을 자동으로 실행시켜주는 간단한 기능이다. 그렇다면 test디렉토리를 만들어서, 디렉토리에 들어올 때 바로 test_virtualenv virtualenv로 설정되게 해보자! 명령어 한 줄을 입력하는 귀찮음을 덜 수 있는 것이다.
$ mkdir test_virtualenv $ cd test_virtualenv $ vim .env .env파일안에 다음과 같은 내용을 입력하자.
pyenv shell test_virtualenv 제일 먼저 디렉토리에 들어가게 되면, .env의 내용을 실행할 것인지 물어보게 된다. 이 때 ‘y’를 입력해서 계속 실행되게 해야한다.
이제 터미널에서 test폴더에 들어갈 때마다 자동으로 test_virtualenv virtualenv를 쓰게 될 것이다! autoenv는 이것 뿐만 아니라 다른 분야에도 무궁무진하게 적용할 수 있다.
pyenv를 OS X(맥)에 설치하기 위해서는 xcode command line tools과 zlib가 먼저 설치되어 있어야 합니다. xcode command line tools과 zlib를 OS X에서 설치하는 명령은 다음과 같습니다. 두 명령을 터미널 상에서 실행합니다.
macoS는 homebrew 를 설치해서 사용하는 것을 가정하고 homebrew로 시스템 python 을 설치한다
pyenv를 OS X(맥)에 설치하기 위해서는 xcode command line tools과 zlib가 먼저 설치되어 있어야 합니다. xcode command line tools과 zlib를 OS X에서 설치하는 명령은 다음과 같습니다. 두 명령을 터미널 상에서 실행합니다.
pyenv-installer 를 이용하여 pyenv를 설치하면, 다음과 같은 pyenv 플러그인도 설치됩니다.
pyenv-doctor
pyenv-pip-rehash
pyenv-update
pyenv-virtualenv
pyenv-which-ext
pyenv-installer는 pyenv 설치 스크립트 입니다. rbenv-installer의 스타일을 빌려서 만든 것입니다. pyenv-installer는 리눅스용 쉘 스크립트 파일입니다. pyenv-installer를 이용하여 pyenv를 설치하기 위해서는 curl과 git이 사전에 설치되어 있어야 합니다.
pyenv {sub-command} [{parameters}….] pyenv가 제공하는 서브 명령은 다음과 같습니다.
서브 명령
설명
local
현재 디렉터리에 python 버전 확인 및 python 버전 지정
global
전역으로 설정된 python 버전
shell
shell에 파이썬 버전을 지정
install
python-build를 이용하여 파이썬 버전을 설치
uninstall
지정한 버전의 파이썬을 삭제
version
현재 활성화된 파이썬 버전 출력
versions
pyenv로 설치되어 이용 가능한 버전을 출력
which
활성화된 파이썬 명령의 위치 출력
whence
지정한 명령을 포함하는 모든 파이썬 버전 출력
버전 설치
pyenv로 설치할 수 있는 버전의 목록을 보려면 다음과 같은 명령어를 입력한다.
1
$ pyenv install --list
[list들] 엄청나게 많은 버전들이 있을텐데, 여기서는 현재 최신 버전인 3.5.2버전을 설치하도록 하겠다. (목록에서 위로 올리다 보면 있다)
1
$ pyenv install 3.5.2
이렇게 하면 설치가 완료된다. 설치하는데에 시간이 조금 오래 걸린다. 설치된 목록을 확인하려면 다음과 같은 명령어를 입력한다.
1 2 3 4
$ pyenv versions
* system (set by PYENV_VERSION environment variable) 3.5.2
shell 명령
설치된 버전은 pyenv versions 명령으로 나타나고, 버전 이름 맨 앞의 *표시는 현재 사용하고 있는 Python버전이다. 현재 쉘에서 다른 버전으로 옮기려면 shell 명령어를 입력한다.
1
$ pyenv shell 3.5.2
Uninstall
This is handy because removing these versions is trivial:
1
$ rm -rf ~/.pyenv/versions/2.7.15
Of course pyenv also provides a command to uninstall a particular Python version:
1
$ pyenv uninstall 2.7.15
Global & Local
시스템 수준의 버전 지정은 global 명령과 local 명령으로 지정할 수 있다.
global 글로벌 설정
pyenv를 시스템 수준의 python 버전을 설정해서 시스템의 기본 파이썬 버전으로 지정할 때 유용하다.
다음은 컴퓨터의 글로벌 파이썬 버전을 파이썬 2.7.12에서 새로 설치한 파이썬 3.5.3으로 변경하는 예입니다. 아래 명령을 수행한 후, python을 실행하면 Python 3.5.3 버전이 실행됩니다
1 2 3
$ pyenv versions * system 3.5.3 (set by /Users/qkboo/.pyenv/version)
1 2 3 4 5 6 7 8 9
$ python --version ## 현재 파이썬 버전 Python 2.7.12 $ pyenv global 3.5.3 ## 글로벌 파이썬 설정 변경 $ python --version ## 현재 파이썬 버전 Python 3.5.3 $ pyenv versions ## pyenv 활성 버전 확인 system * 3.5.3 (set by /Users/qkboo/.pyenv/version) $
global 명령을 내리면 ~/.pyenv/version 파일을 해당 버전으로 지정한다
local 로컬 설정
특정 디렉터리에 활성화되는 파이썬 버전을 지정할 수 있습니다. 그리고 로컬 디렉토리 이외에서는 global 설정이 적용됩니다.
$ pyenv versions ## global 설정 3.5.3 system 2.7.13 * 3.5.3 (set by /home/opc/.pyenv/version)
$ python -V ## Global 파이썬 버전 Python 3.5.3 $ mkdir py2.7 $ cd py2.7/ $ pyenv local 2.7.13 ## local 설정 2.7.13 [py2.7]$ python -V Python 2.7.13 [py2.7]$ ls -al total 12 drwxrwxr-x 2 opc opc 4096 Sep 8 01:47 . drwx------. 10 opc 500 4096 Sep 8 01:47 .. -rw-rw-r-- 1 opc opc 7 Sep 8 01:47 .python-version [py2.7]$ cat .python-version ## local 설정 파일 2.7.13 [py2.7]$ cd .. ## global 설정 3.5.3 $ python -V Python 3.5.3 [opc@b4b8b6 ~]$
“pyenv local“를 실행하면 해당 디렉터리에 .python-version 파일이 생기고 이 파일에 활성화될 파이썬 버전이 기록됩니다.
Test suite
Pro Tip: A great way to get peace of mind that the version of Python you just installed is working properly is to run the built-in test suite:
1 2
$ pyenv global 3.8-dev $ python -m test
This will kick off lots of internal Python tests that will verify your installation. You can just kick back and watch the tests pass.
Using your environment in IDEs
If you are not as sehell person, you can also use pyenv with your favourite IDE. Many editors and IDEs are aware of pyenv environments and will detect them for you. Then you will be able to select the environment for your current workspace from a dropdown menu.
To control whether or not each shell session has the base environment activated or not, run conda config –set auto_activate_base False or True. To run conda from anywhere without having the base environment activated by default, use conda config –set auto_activate_base False. This only works if you have run conda init first.
(cv3python3) ~/$ python Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0' >>>
$ python Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0' >>>
시스템에서 파이썬이 두 개 이상 설치되어 있으면 일반적을 Python2.7 버전이 기본 파아썬 이다.
1 2 3 4 5 6 7 8
$ python3 Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0-dev' >>>
만약 main module과 extra module을 같이 사용하고 싶다면 아래처럼 설치합니다.
1
> pip install opencv-contrib-python
conda 명령으로 설치하기
Anaconda 3가 설치되어 있다면 명령어 한 줄 입력만으로도 거의 최신 버전(글 작성시 버전 3.6.0)의 Python-OpenCV 라이브러리를 설치할 수 있다:
1
> conda install -c conda-forge opencv
conda-forge에 등록되어 있는 OpenCV 라이브러리에 대한 상세한 설명은 링크를 통해 확인할 수 있습니다. 필요한 경우, python virtualenv를 생성하여 개발환경 패키지를 관리할 수 있다.
OpenCV 3.3의 가장 큰 변화는 Deep Learning in OpenCV 라고 할 수 있겠습니다. 해당 링크에서 Deep Learning 관련 추가된 사항을 확인할 수 있습니다. 이외에 자세한 변경 로그는 OpenCV Change Logs Version:3.3을 참고하시면 되겠습니다.
여담으로 최신 버전 OpenCV 3.3.1 버전 이후에는 JavaScript Interface가 추가되어 인터랙티브 웹-기반 OpenCV 어플리케이션 구현이 공식적으로 가능해졌다고 한다.
$ python Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0' >>>
시스템에서 파이썬이 두 개 이상 설치되어 있으면 일반적을 Python2.7 버전이 기본 파아썬 이다.
1 2 3 4 5 6 7 8
$ python3 Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0-dev' >>>
Python 가상환경과 Opencv
파이썬 개발시 virtualenv 를 사용한다면 OpenCV 라이브러리를 연결해 줄 필요가 있다. virtualenv 가상환경 생성시 파이썬 라이브러리는 복사가 안된다 그래서 가상환경 생성후에 cv2.so 라이브러리를 링크해줄 필요가 있다.
가상환경에 cv2.so 연결하기
python2 가상환경 cv3python2 가 있고, 여기에 OpenCV 를 사용하려면 다음 같이 cv2.so 라이브러리를 링크해 준다.
1 2
$ cd ~/.virtualenvs/cv3python2/lib/python2.7/site-packages/ $ ln -s /usr/local/lib/python2.7/dist-packages/cv2.so cv2.so
역시 python3 가상환경 cv3python3 가 있다면 python3 라이브러리에 있는 cv2.so 라이브러리를 링크해 준다.
1 2
$ cd ~/.virtualenvs/cv3python3/lib/python3.4/site-packages/ $ ln -s /usr/local/lib/python3.4/dist-packages/cv2.cpython-34m.so cv2.so
또한 cv2.so를 사용하기 위해서 각 가상환경에 numpy를 설치해 준다. Raspberry Pi 2에서 numpy를 pip로 설치할 때 약 10분 이상 소요된다.
(cv3python3) ~/$ python Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import cv2 >>> cv2.__version__ '3.1.0' >>>
$:~ $ python3 Python 3.4.2 (default, Oct 19 2014, 13:31:11) [GCC 4.9.1] on linux Type "help", "copyright", "credits" or "license"for more information. >>> import numpy as np >>> np.__version__ '1.10.4' >>>
위 스크립은 OpenCV 3.1.0의 CMake 빌드 버그로, OpenCV 3.0.0 까지 -D INSTALL_C_EXAMPLES=ON으로 빌드했지만 3.1.0에서는 -D INSTALL_C_EXAMPLES=OFF로 해야한다. 또한 opencv_contrib 모듈을 함께 빌드한다면 -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib/modules를 함께 사용한다.
컴파일과 설치
그리고 컴파일 한다.
1 2 3 4 5 6 7 8
~(cv)$ make -j4 # RPi2
... [100%] Built target example_ocl_tvl1_optical_flow
real 173m22.432s user 165m58.970s sys 5m7.060s
싱글로 make시 Raspberry Pi 2 에서 빌드시 약 3시간 소요. -j 옵션을 이용시 45분 이상 절약.
$ ls lib/cv2.so $ ls lib/python3/cv2.cpython-34m.so
이 두 라이브러리가 생성되 있으면 빌드가 제대로 된 것이다.
이제 로컬 시스템에 설치를 한다. 보통 Python2.7과 Python3.4가 함께 설치되 상태일 수 있는데 이 경우 시스템에 기본 Python2.7 환경을 기반으로 설치가 된다.
1 2 3 4 5 6 7 8 9 10
(cv)$ sudo make install ... -- Installing: /usr/local/include/opencv2/contrib/detection_based_tracker.hpp -- Installing: /usr/local/lib/python2.7/dist-packages/cv2.so -- Set runtime path of "/usr/local/lib/python2.7/dist-packages/cv2.so" to "/usr/local/lib" -- Installing: /usr/local/lib/python2.7/dist-packages/cv.py -- Installing: /usr/local/lib/libopencv_stitching.so.2.4.11 ...
(cv)$ sudo ldconfig
설치된 opencv 패키지 버전을 확인한다.
1 2
$ pkg-config --modversion opencv 3.1.0
cv2.so
Python2.7이 함께 설치되어 있는 경우 빌드시 Python3.x의 site-packages에 파일 cv2.cpython-34mu.so 로 설치되어 있다. 이 파일은 실제 파이썬 바인딩으로 실제 파이썬 환경에서 이 라이브러리가 필요하기 하다. Python3 가상환경에서 이 파일 심볼릭 링크를 cv 환경에 cv2.so라는 이름으로 연결해 준다.
파이썬은 관행적으로 opencv 라이브러리를 cv2.so 파일로 표현하고 있다. python3의 경우 라이브러리 이름을 cv2로 링크해 준다.
1 2 3 4
$ cd /usr/local/lib/python3.4/dist-packages $ ls cv2.cpython-34m.so numpy numpy-1.11.2.egg-info $ sudo ln -s cv2.cpython-34m.so cv2.so
이 문서는 MongoDB Community Edition 를 리눅스 플랫폼에서 시작과 운영에 필요한 구성 파일 mongod.conf 의 설정을 다루고 있다. 이를 통해 데이터베이스 서비스를 동작시키고, 인증한 사용자로서 클라이언트 프로그램으로 접속하기 위한 기본 인증방식을 구성하는 것을 정리하고 있다.
이 문서는 Arm64 기반 CPU를 사용하는 Raspberry Pi, Odroid, PINE64, OrangePi 등 SBC 지원 보드 계열 위에서 Ubuntu/Debian 에서 설치 및 사용 가능한 MongoDB Community Edition 4.2 버전을 설치하고 구성하는 과정을 정리하고 있다.
W: GPG error: https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 4B7C549A058F8B6B
1 2 3 4 5
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 3B4FE6ACC0B21F32 7C549A058F8B6B gpg: key 4B7C549A058F8B6B: public key "MongoDB 4.2 Release Signing Key <packaging@mongodb.com>" imported gpg: Total number processed: 1 gpg: imported: 1
명령으로 mongod 로 실행이 가능한 MongoDB Server는 기본적으로 보안 모델이 없이 실행된다. 따라서 별도의 인증 절차를 가지고 있지 않습니다. 이 때문에 2017년 1월에는 이런 약점을 노린 랜섬웨어가 발생하기도 했습니다. MongoDB는 되도록이면 외부로부터의 신뢰되지 않은 접속을 허용하지 않는, 보안에 문제가 되지 않는 환경에서 보안 모델 없이 실행하는 것을 지향하고 있으나, 어쨌든 MongoDB도 ID와 비밀번호로 접근하는 기본적인 보안 모델을 가지고 있으니 이를 통해 MongoDB Server에 인증 과정을 추가해 보도록 합시다.
비인증 모드에서 관리자 계정 생성
인증 접속
1. 비인증 관리자 계정 생성하기
mongod로 별도의 보안 모델이 없는 MongoDB Server를 실행하고, MongoDB Shell에 접속합니다.
1 2 3 4
> mongo MongoDB shell version v3.6.3 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.6.3
MongoDB에는 admin이라는 데이터베이스가 존재하며, 해당 데이터베이스에 사용자를 추가합니다.
db.createUser()는 현재 사용하고 있는 데이터베이스(여기서는 admin)에 사용자를 추가합니다. 여기에는 사용자 이름, 비밀번호와 함께 권한(roles)을 array로 정의합니다. MongoDB에서 빌트인으로 제공하고 있는 권한은 MongoDB Built-In Roles에서 확인할 수 있습니다.
위에서 정의한 userAdminAnyDatabase는 어느 데이터베이스든 사용자를 생성하고 제거할 수 있다는 것을 의미합니다. 모든 권한을 가지게 하려면 root를 사용하면 되고, MongoDB 2.4 이하의 경우 db.addUser()를 통해 사용자를 추가합니다.
mongod 인증하기
만약 mongod 명령으로 실행하면 MongoDB Server를 실행하도록 한다.
1
> mongod --auth
MongoDB Server 재시작하기
Ubuntu와 같은 리눅스 시스템에서 service mongod start처럼 service를 이용할 경우, config 파일을 통해 실행됩니다. 이 경우 /etc/mongod.conf를 다음처럼 수정하고 재시작(service mongod restart)하면 됩니다.
mongodb 4.x
인증을 활성화 하려면
1 2
security: authorization: enabled
mongodb 3.x
mongod.conf 를 사용하면 다음 옵션을 true 로 구성한다.
1
auth = true
그리고 서비스를 재시작한다.
1 2
$ sudo systemctl restart mongod.service
2. 인증 접속
mongo 쉘에 접속하여 db.auth()를 사용하는 것입니다.
1 2 3 4 5
$ mongo MongoDB shell version v4.2.1 connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb Implicit session: session { "id" : UUID("177716fe-5b3c-41f6-bdae-d2584819abff") } MongoDB server version: 4.2.1
쉘에서 db.auth() 를 사용해 인증에 성공하면 1이 나오면 성공이다.
1 2 3 4 5
> use admin switched to db admin > db.auth('admin', '!23456789'); 1 >
인증 접속이 되면 로그에 아래 같은 로그를 확인할 수 있다.
1
2019-12-02T09:49:24.392+0000 I ACCESS [conn3] Successfully authenticated as principal admin on admin from client 127.0.0.1:52370
명령행에서 접근
인증과 함께 admin 데이터베이스로 접근하려면 아래 같이 명령어에 아이디와 비밀번호를 명시만 해 주면 된다.