2017-01-21 3 views
2

Сейчас я использую virtualenv для своих приложений, развернутых на производстве.Полностью изолированная среда Python

Я бегу мои приложения как

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

или

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

Недавно мы перешли на Python 3. Самый последний Python 3.6 не был доступен для Ubuntu 14.04, поэтому я скомпилировал сам. Компиляция также позволяет мне использовать оптимизацию с использованием ./configure --enable-optimizations.

Итак, я думаю о том, чтобы всегда составлять Python самостоятельно в своих развертываниях. Но в то же время сохраняя структуру файла virtualenv, так что команды, которые я использую для запуска приложений в моей виртуальной среде, останутся прежними.

Я видел людей, рекомендуя используя pyenv, но то, что я не люблю об этом является то, что он хранит сам Python в ~/.penv и, судя по всему, мне нужно возиться с PATH переменных окружения, чтобы мои команды работают в Cron и скрипты оболочки, которые мне не нравятся. Я хотел бы сохранить всю среду в одном каталоге, если это возможно.

Итак, мой вопрос: могу ли я каким-то образом скомпилировать Python в каталог venv в моем каталоге проектов, чтобы структура каталогов была такой же, как при использовании virtualenv? Как:

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

AFAIK вы не можете сделать это. Если вы хотите такую ​​изоляцию, используйте Docker. – yedpodtrzitko

+0

Я вполне уверен, что это возможно. И не сложно. Просто нужно понять. – warvariuc

ответ

2

Вы можете указать Python бинарного при создании virutalenv:

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

Вот сценарий я придумал:

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" 
Смежные вопросы