【问题标题】:Fully isolated Python environment完全隔离的 Python 环境
【发布时间】:2017-06-06 09:54:37
【问题描述】:

现在我将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/
                    ...

【问题讨论】:

  • Afaik 你不能那样做。如果你想要这样的隔离,请使用 Docker。
  • 我很确定这是可能的。而且并不复杂。只是需要一些见解。

标签: python virtualenv pyenv


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这是我想出的脚本:

    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"
    

    【讨论】:

      猜你喜欢
      • 2018-08-19
      • 1970-01-01
      • 2022-10-17
      • 2020-04-28
      • 2016-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多