2017-01-21 4 views
2

지금은 프로덕션 환경에 배포 된 응용 프로그램에 virtualenv을 사용하고 있습니다.완전히 분리 된 Python 환경

내가

cd $PROJECT_DIR 
venv/bin/gunicorn -c gunicorn.conf.py my_app.wsgi:application 

또는 최근에 우리가 가장 최근 파이썬 3.6 우분투 14.04을 위해 사용할 수 없습니다 파이썬 3으로 마이그레이션 한

cd $PROJECT_DIR 
venv/bin/celery worker --app=my_app.celery_tasks 

처럼 내 응용 프로그램을 실행하고, 그래서 그것을 컴파일 나 혼자서. 컴파일하면 ./configure --enable-optimizations을 사용하여 최적화 할 수 있습니다.

그래서 배포 할 때 항상 파이썬을 컴파일하는 방법에 대해 생각하고 있습니다. 그러나 동일한 시간에 virtualenv 파일 구조를 유지하므로 내 가상 환경에서 실행중인 응용 프로그램에 사용하는 명령이 동일하게 유지됩니다.

나는 사람들이 pyenv를 사용 추천,하지만 난 그게 분명히, 내 명령 크론에서 작동하도록 PATH 환경 변수와 바이올린 필요가 ~/.penv에 파이썬 자체를 저장한다는 것입니다 약 좋아하지 않는 것을 본 적이 쉘 스크립트는 내가 좋아하지 않는다. 가능하면 모든 환경을 하나의 디렉토리에 보관하고 싶습니다.

내 질문은 어떻게 든 내 프로젝트 디렉토리에 venv 디렉토리에 파이썬을 컴파일 할 수 있습니다. 따라서 디렉토리 구조가 virtualenv 일 때와 같을 수 있습니까? 마찬가지로 다음 virutalenv를 만들 때

$PROJECT_DIR/ 
    my_app/ 
    venv/ 
     bin/ 
      python 
      python3.6 
      celery 
      gunicorn 
      ... 
     lib/ 
      python3.6/ 
       site-packages/ 
        celery/ 
        gunicorn/ 
        ... 
+0

: 여기

virtualenv env -p /path/to/compiled/python3.6 
yedpodtrzitko

+0

나는 그것이 가능하다는 것을 확신한다. 그리고 복잡하지 않습니다. 그냥 통찰력이 필요합니다. – warvariuc

답변

2

당신은 파이썬 바이너리를 지정할 수 있습니다 : 당신은 할 수 없습니다 AFAIK

HERE=$((cd -P $(dirname $0) && pwd)) 
REQUIRED_PY_VERSION=$(cat ".python_version") 
USR_DIR="$HERE/usr" 
VENV_DIR="$HERE/venv" 

echo "The system Python has another version $py_version" 
echo "Downloading, compiling and installing the required version" 
py_file_name="Python-$REQUIRED_PY_VERSION.tgz" 
wget "https://www.python.org/ftp/python/$REQUIRED_PY_VERSION/$py_file_name" -O "$py_file_name" 

py_source_dir="Python-$REQUIRED_PY_VERSION" 
echo "Unpacking Python source code to $py_source_dir..." 
mkdir -p "$py_source_dir" 
tar xzvf "$py_file_name" --directory="$py_source_dir" --strip-components=1 
cd "$py_source_dir" 

# make clean 
echo "Configuring compilation..." 
./configure --enable-optimizations --prefix="$USR_DIR" 
echo "Compiling..." 
make 
echo "Installing..." 
make install 

cd .. 
echo "Removing downloaded files" 
rm "$py_file_name" 
rm -rf "$py_source_dir" 
py_path="$USR_DIR/bin/python3" 

echo "Creating virtual environment directory in $VENV_DIR" 
"$py_path" -m venv "$VENV_DIR" 
0

내가 해낸 스크립트입니다. 그런 분리가 필요하면 Docker를 사용하십시오.