Полностью изолированная среда Python
Щас пользуюсь virtualenv
для моих приложений, развернутых в производстве.
Я запускаю свои приложения как
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 и shell-скриптах, что мне не нравится. Я хотел бы сохранить всю свою среду в одном каталоге, если это возможно.
Итак, мой вопрос, могу ли я как-нибудь скомпилировать Python в venv
каталог в моем каталоге проекта, так что структура каталога будет такой же, как при использовании virtualenv
? Подобно:
$PROJECT_DIR/
my_app/
venv/
bin/
python
python3.6
celery
gunicorn
...
lib/
python3.6/
site-packages/
celery/
gunicorn/
...
2 ответа
Вы можете указать двоичный Python при создании virutalenv:
virtualenv env -p /path/to/compiled/python3.6
Вот сценарий, который я придумал:
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"