[Python] 가상환경(pyenv-virtualenv) 파이썬을 crontab에서 실행하기

pyenv-virtualenv를 이용해 가상환경에서 만든 파이썬을 crontab에 추가해 실행하는 방법을 알아보자


환경

  • Linux
  • pyenv
  • pyenv-virtualenv


글 배경

배경

  • 파이썬 버전에 따른 의존성을 없애기 위해 pyenvpyenv-virtualenv와 같은 가상환경을 사용하는데 가상환경에서 만든 코드를 crontab에서 실행할 상황이 생겼다.
  • crontab뿐만 아니라 systemd에 서비스를 등록할 때나 쉘스크립트를 작성해서 실행할 때도 적용 가능하다.


사전 지식

파이썬 모듈과 경로

  • 결국 파이썬을 실행할 때 중요한 부분은 여러가지가 있겠지만 모듈이 저장된 위치와 사용할 파이썬이 어디에 위치하냐가 중요하다.


sys.path

  • sys.path: 파이썬 모듈을 사용할 때 참조하는 경로를 저장하고 있는 리스트입니다.
  • import를 사용해서 모듈을 가져올 때 참조하게 됩니다.
>>> import sys
>>> sys.path
['', '/home/twpower/.pyenv/versions/3.6.2/lib/python36.zip', '/home/twpower/.pyenv/versions/3.6.2/lib/python3.6', '/home/twpower/.pyenv/versions/3.6.2/lib/python3.6/lib-dynload', '/home/twpower/.pyenv/versions/jupyter-notebook/lib/python3.6/site-packages']


pyenv versions

  • pyenv를 통해 설치된 여러 파이썬 버전들을 볼 수 있는 명령어
  • pyenv-virtualenv를 통해 만든 가상환경들도 목록에 나온다.
$ pyenv versions
* system (set by /home/twpower/.pyenv/version)
  3.5.2
  3.5.3
  3.6.1
  3.6.2
  3.6.2/envs/jupyter-notebook
  3.6.2/envs/test
  jupyter-notebook
  test


pyenv path

  • 위에 나온 pyenv versions에 해당하는 파이썬 및 모듈들은 $(pyenv root)/versions의 경로에 있다.
$ ls /home/twpower/.pyenv/versions/
3.5.2  3.5.3  3.6.1  3.6.2  jupyter-notebook  test


적용 방법

방법1 - 사용할 가상환경의 파이썬을 직접 선택

  • pyenv-virtualenv는 가상환경마다 사용하는 파이썬이 다릅니다. 그렇기에 사용하는 경로도 다르고 그에 따른 sys.path도 다릅니다.
  • pyenv-virtualenv에서 사용하는 파이썬을 직접 이용해 .py파일을 실행하면 됩니다.
  • 경로: [pyenv root]/versions/[virtualenv name]/bin/[python version]

crontab

30 20 * * * /home/twpower/.pyenv/versions/jupyter-notebook/bin/python3.6 /home/twpower/test.py


방법2 - 스크립트에서 “pyenv activate”를 사용

  • 쉘 스크립트로 파일을 만들고 해당 스크립트에 pyenv activate를 통해 가상환경을 만들어주고 파이썬 코드를 실행합니다.

test.sh

#!/bin/bash

source /home/twpower/.bash_profile
source /home/twpower/.bashrc

pyenv activate jupyter-notebook
python /home/twpower/test.py

crontab

30 20 * * * /home/twpower/test.sh


참고자료