Полностью изолированная среда Python

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

Я запускаю свои приложения, как

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

or

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/
                    ...

person warvariuc    schedule 21.01.2017    source источник
comment
Афаик, ты не можешь этого сделать. Если вам нужна такая изоляция, используйте Docker.   -  person yedpodtrzitko    schedule 21.01.2017
comment
Я совершенно уверен, что это возможно. И не сложный. Просто нужны некоторые идеи.   -  person warvariuc    schedule 21.01.2017


Ответы (2)


Вы можете указать двоичный файл Python при создании virutalenv:

virtualenv env -p /path/to/compiled/python3.6
person Harald Nordgren    schedule 21.01.2017

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

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"
person warvariuc    schedule 22.01.2017