完全隔离 Python 环境
Fully isolated Python environment
现在我正在使用 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,所以我自己编译了它。编译它还可以让我从使用 .
的优化中受益
所以我考虑在我的部署中总是自己编译 Python。但同时保持 virtualenv
文件结构,以便我在虚拟环境中用于 运行 应用程序的命令将保持不变。
我看到有人推荐使用 pyenv
,但我不喜欢它的是它将 Python 本身存储在 ~/.penv
中,显然,我需要到 fiddle 和 PATH
环境变量,使我的命令在 Cron 和 shell 脚本中工作,我不喜欢这些。如果可能的话,我想把我所有的环境都放在一个目录中。
所以我的问题是,我能否以某种方式将 Python 编译到我的项目目录中的 venv
目录中,以便目录结构与使用 virtualenv
时的目录结构相同?喜欢:
$PROJECT_DIR/
my_app/
venv/
bin/
python
python3.6
celery
gunicorn
...
lib/
python3.6/
site-packages/
celery/
gunicorn/
...
您可以在创建 virtualenv 时指定 Python 二进制文件:
virtualenv env -p /path/to/compiled/python3.6
这是我想出的脚本:
HERE=$( (cd -P $(dirname [=10=]) && 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"
现在我正在使用 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,所以我自己编译了它。编译它还可以让我从使用
所以我考虑在我的部署中总是自己编译 Python。但同时保持 virtualenv
文件结构,以便我在虚拟环境中用于 运行 应用程序的命令将保持不变。
我看到有人推荐使用 pyenv
,但我不喜欢它的是它将 Python 本身存储在 ~/.penv
中,显然,我需要到 fiddle 和 PATH
环境变量,使我的命令在 Cron 和 shell 脚本中工作,我不喜欢这些。如果可能的话,我想把我所有的环境都放在一个目录中。
所以我的问题是,我能否以某种方式将 Python 编译到我的项目目录中的 venv
目录中,以便目录结构与使用 virtualenv
时的目录结构相同?喜欢:
$PROJECT_DIR/
my_app/
venv/
bin/
python
python3.6
celery
gunicorn
...
lib/
python3.6/
site-packages/
celery/
gunicorn/
...
您可以在创建 virtualenv 时指定 Python 二进制文件:
virtualenv env -p /path/to/compiled/python3.6
这是我想出的脚本:
HERE=$( (cd -P $(dirname [=10=]) && 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"