完全隔离的Python环境

完全隔离的Python环境,python,virtualenv,pyenv,Python,Virtualenv,Pyenv,现在,我正在为部署在生产环境中的应用程序使用virtualenv 我正在像这样运行我的应用程序 cd $PROJECT_DIR venv/bin/gunicorn -c gunicorn.conf.py my_app.wsgi:application 或 最近我们已经迁移到Python 3。最新的Python3.6不适用于Ubuntu14.04,所以我自己编译了它。编译它还可以让我从使用的优化中获益 因此,我一直在考虑在部署中自己编译Python。但同时保持virtualenv文件结构,以便我

现在,我正在为部署在生产环境中的应用程序使用
virtualenv

我正在像这样运行我的应用程序

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

最近我们已经迁移到Python 3。最新的Python3.6不适用于Ubuntu14.04,所以我自己编译了它。编译它还可以让我从使用的优化中获益

因此,我一直在考虑在部署中自己编译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/
                    ...

您可以在创建virutalenv时指定Python二进制文件:

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"

好吧,你不能这么做。如果你想要这样的隔离,请使用Docker。我确信这是可能的。并不复杂。只是需要一些见解。
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"