갈루아의 반서재

 

아나콘다 환경을 재빠르게 다시 구축하기 위해서는 포함된 패키지와 각각의 버전 정보가 필요하다. 아나콘다 환경 공유방법을 아래에서 알아보자.

Exporting the environment.yml file

첫번째 방법은 현재의 환경 정보가 담긴 yml 파일을 생성하는 것이다. 다음과 같이 가능하다.

먼저 가상환경을 활성화시킨다.

fossa@fossa:~$ conda activate quintic

현재의 가상환경 설정을 다음과 같이 quintic_environment.yml 파일로 내보낸다. 

(quintic) fossa@fossa:~$ conda env export > quintic_environment.yml

정상적으로 export 되었으면 다음과 같이 yml 파일이 생성된 것을 확인할 수 있다. 해당 위치에 environment.yml 파일이 존재한다면, 해당 파일을 덮어쓰게 된다.

방금 생성된 yml 파일을 열어보면, 다음과 같이 각종 패키지 및 버전 정보를 담고 있다. 해당 파일은 pip 패키지와 conda 패키지 모두를 다루고 있음을 알 수 있다. 해당 파일을 아나콘다 환경을 공유하고자하는 사람에게 메일 등의 방법으로 전송한다. 

 

/home/fossa/quintic_environment.yml

name: quintic
channels:
  - conda-forge
  - defaults
dependencies:
  - _libgcc_mutex=0.1=main
  - attrs=19.3.0=py_0
  - backcall=0.2.0=pyh9f0ad1d_0
  - bleach=3.1.5=pyh9f0ad1d_0
  - brotlipy=0.7.0=py38h1e0a361_1000
  - ca-certificates=2020.6.20=hecda079_0
  - certifi=2020.6.20=py38h32f6830_0
  - cffi=1.14.0=py38he30daa8_1
  - chardet=3.0.4=py38h32f6830_1006
  - cryptography=3.0=py38h766eaa4_0
  - decorator=4.4.2=py_0
  - defusedxml=0.6.0=py_0
  - entrypoints=0.3=py38h32f6830_1001
  - idna=2.10=pyh9f0ad1d_0
  - importlib-metadata=1.7.0=py38h32f6830_0
  - importlib_metadata=1.7.0=0
  - ipykernel=5.3.4=py38h23f93f0_0
  - ipython=7.16.1=py38h23f93f0_0
  - ipython_genutils=0.2.0=py_1
  - jedi=0.17.2=py38h32f6830_0
  - jinja2=2.11.2=pyh9f0ad1d_0
  - json5=0.9.4=pyh9f0ad1d_0
  - jsonschema=3.2.0=py38h32f6830_1
  - jupyter_client=6.1.6=py_0
  - jupyter_core=4.6.3=py38h32f6830_1
  - jupyterlab=2.2.0=py_0
  - jupyterlab_server=1.2.0=py_0
  - ld_impl_linux-64=2.33.1=h53a641e_7
  - libedit=3.1.20191231=h7b6447c_0
  - libffi=3.3=he6710b0_1
  - libgcc-ng=9.1.0=hdf63c60_0
  - libsodium=1.0.17=h516909a_0
  - libstdcxx-ng=9.1.0=hdf63c60_0
  - markupsafe=1.1.1=py38h1e0a361_1
  - mistune=0.8.4=py38h1e0a361_1001
  - nbconvert=5.6.1=py38h32f6830_1
  - nbformat=5.0.7=py_0
  - ncurses=6.2=he6710b0_1
  - notebook=6.0.3=py38h32f6830_1
  - openssl=1.1.1g=h516909a_0
  - packaging=20.4=pyh9f0ad1d_0
  - pandoc=2.10.1=h516909a_0
  - pandocfilters=1.4.2=py_1
  - parso=0.7.1=pyh9f0ad1d_0
  - pexpect=4.8.0=py38h32f6830_1
  - pickleshare=0.7.5=py38h32f6830_1001
  - pip=20.1.1=py38_1
  - prometheus_client=0.8.0=pyh9f0ad1d_0
  - prompt-toolkit=3.0.5=py_1
  - ptyprocess=0.6.0=py_1001
  - pycparser=2.20=pyh9f0ad1d_2
  - pygments=2.6.1=py_0
  - pyopenssl=19.1.0=py_1
  - pyparsing=2.4.7=pyh9f0ad1d_0
  - pyrsistent=0.16.0=py38h1e0a361_0
  - pysocks=1.7.1=py38h32f6830_1
  - python=3.8.3=hcff3b4d_2
  - python-dateutil=2.8.1=py_0
  - python_abi=3.8=1_cp38
  - pyzmq=19.0.1=py38ha71036d_0
  - readline=8.0=h7b6447c_0
  - requests=2.24.0=pyh9f0ad1d_0
  - send2trash=1.5.0=py_0
  - setuptools=47.3.1=py38_0
  - six=1.15.0=pyh9f0ad1d_0
  - sqlite=3.32.3=h62c20be_0
  - terminado=0.8.3=py38h32f6830_1
  - testpath=0.4.4=py_0
  - tk=8.6.10=hbc83047_0
  - tornado=6.0.4=py38h1e0a361_1
  - traitlets=4.3.3=py38h32f6830_1
  - wcwidth=0.2.5=pyh9f0ad1d_0
  - webencodings=0.5.1=py_1
  - wheel=0.34.2=py38_0
  - xz=5.2.5=h7b6447c_0
  - zeromq=4.3.2=he1b5a44_2
  - zipp=3.1.0=py_0
  - zlib=1.2.11=h7b6447c_3
  - pip:
    - absl-py==0.9.0
    - asgiref==3.2.10
    - astunparse==1.6.3
    - cachetools==4.1.1
    - click==7.1.2
    - django==3.0.8
    - gast==0.3.3
    - google-auth==1.19.2
    - google-auth-oauthlib==0.4.1
    - google-pasta==0.2.0
    - grpcio==1.30.0
    - gspread==3.6.0
    - h5py==2.10.0
    - httplib2==0.18.1
    - keras-preprocessing==1.1.2
    - markdown==3.2.2
    - numpy==1.19.1
    - oauth2client==4.1.3
    - oauthlib==3.1.0
    - opt-einsum==3.3.0
    - pillow==7.2.0
    - protobuf==3.12.2
    - pyasn1==0.4.8
    - pyasn1-modules==0.2.8
    - pytz==2020.1
    - requests-oauthlib==1.3.0
    - rsa==4.6
    - scipy==1.4.1
    - sqlparse==0.3.1
    - svgwrite==1.4
    - tensorboard==2.2.2
    - tensorboard-plugin-wit==1.7.0
    - tensorflow==2.2.0
    - tensorflow-estimator==2.2.0
    - termcolor==1.1.0
    - tree==0.2.4
    - urllib3==1.25.9
    - werkzeug==1.0.1
    - wrapt==1.12.1
prefix: /home/fossa/anaconda3/envs/quintic

 

Exporting an environment file across platforms

크로스 플랫폼으로 해당 환경을 내보내고자하는 경우에는 conda env export --from-history 플래그를 이용하면 된다. 이 경우에는 환경내의 모든 패키지 말고 명시적으로 설치한 패키지만 포함된다. 예를 들어, 아나콘다 가상환경 구축 후 다음과 같이 Python 및 패키지를 설치했다고 하자. 

conda install python=3.7 codecov

이 경우 의존성 문제로 다수의 추가적인 패키지를 다운로드하여 설치하게 된다. 이 경우 플랫폼에 따라서는 호환되지 않는 패키지도 포함하게되는 것이다. conda env export 명령을 사용하면,이러한 모든 패키지를 내보내게 되고, 반면 conda env export --from-history 를 사용하게 되면, 명시적으로 선택한 패키지만 내보내게 되어 호환성 문제를 피할 수 있다.

(quintic) fossa@fossa:~$ conda env export --from-history
name: quintic
channels:
  - defaults
dependencies:
  - python=3
  - jupyterlab
prefix: /home/fossa/anaconda3/envs/quintic

 

Creating an environment file manually

마지막으로 수동으로 환경 파일 (environment.yml) 을 만들 수도 있다.

간단한 예

name: stats
dependencies:
  - numpy
  - pandas

자세한 예.메이저 버전 및 마이너 버전만 명시하고 패치 버전은 와일드 카드 처리한 부분도 눈여겨 보자.

name: stats2
channels:
  - javascript
dependencies:
  - python=3.6   # or 2.7
  - bokeh=0.9.2
  - numpy=1.9.*
  - nodejs=0.10.*
  - flask
  - pip:
    - Flask-Testing

 

그리고 nodefaults 를 채널 리스트에 포함시킴으로써 디폴트 채널을 배제할 수 있다.

channels: 
  - javascript 
  - nodefaults

대부분의 conda 명령에 --override-channels 옵션을 붙이는 것과 같은 효과이다. 즉, .condarc 파일내의 채널 리스트에서 디폴트 값을 제거하는 것과 같은 역할을 한다. .condarc 파일을 변경하는 것은 전체에 영향을 미치는 것에 반해 environment.yml 을 변경하는 것은 해당 conda 환경에만 영향을 미친다는 사실을 주의하자. 다음에는 이렇게 생성한 yml 파일로 conda 환경설정을 복원하는 방법에 대해 알아보자.