我正在Ubuntu中开发Python应用程序。我想建立一个distribution/virtualenv/pip生态系统来独立于任何系统Python包(我在Synaptic中管理它们,或者更确切地说,我让系统为我管理它们)来管理我的Python包。
我可以安装python-setuptools, python-virtualenv和python-pip系统包,然后继续我的快乐之路,但我也希望能够获得最新/特定版本的Distribute, virtualenv和pip。这些没有ppa,所以我必须手动安装。
最后一个复杂的问题是,我希望能够为多个版本的Python执行此操作。也就是说,为python2.6设置一个生态系统,为python设置另一个生态系统,为python3设置另一个生态系统,或者在64位系统上为chroot的32位python设置另一个生态系统。
我猜这个过程会是这样的:
- 使用Python X安装我自己的分发副本到我的主文件夹 使用独立分发,easy_install pip使用独立pip安装virtualenv
- 使用indie virtualenv创建虚拟环境
- 激活虚拟环境,安装软件包
- 重复Python Y, Z和Q
我正在寻找什么安装/配置选项?
基于Walker Hale IV的类似(但不同!;))问题,要做到这一点有两个关键:
- 您不需要安装distribute和pip,因为它们会自动包含在新的虚拟环境中(并且您可能只需要使用virtualenv测试过的版本)
- 你可以使用virtualenv的源代码来创建一个新的虚拟环境,而不是使用系统安装的virtualenv
所以工作流是:
- 在你的系统上安装Python版本X
- 下载virtualenv源代码版本Q(可能是最新的)
- 使用Python X和virtualenv Q创建新的虚拟环境
- 你的新VE现在运行Python X和最新的稳定版本的pip和分发
- pip install any other packages
- easy_install任何其他不能pip install的包
指出:
- 在新的虚拟环境中,您可以安装新(或旧)版本的distribute、pip或virtualenv。(我认为)
- 我没有使用WH4的技术来创建一个引导虚拟环境。相反,我每次都从virtualenv源创建新的虚拟环境。 这个技术应该可以在任何操作系统上使用。
- 如果我向一个不熟悉整个分布式/pip/虚拟环境生态系统概念的人解释这一点,我会用一种以虚拟环境为中心的方式来解释。
我写了一个bash脚本,在Ubuntu中做基本的:
#! /bin/bash
# Script to create a python virtual environment
# independently of the system version of virtualenv
#
# Ideally this would be a cross-platform Python
# script with more validation and fewer TODOs,
# but you know how it is.
# = PARAMETERS =
# $1 is the python executable to use
# examples: python, python2.6, /path/to/python
# $2 is the new environment folder
# example: /path/to/env_folder/name
## TODO: should be just a name
## but I can't concatenate strings in bash
# $3 is a pip requirements file
# example: /path/to/req_folder/name.txt
# you must uncomment the relevant code below to use $3
## TODO: should be just a name
## but I can't concatenate strings in bash
# other parameters are hard-coded below
# and you must change them before first use
# = EXAMPLES OF USE =
# . env_create python2.5 /home/env/legacy
## creates environment "legacy" using python 2.5
# . env_create python /home/env/default
## creates environment "default" using whatever version of python is installed
# . env_create python3.2 /home/env/bleeding /home/req/testing.txt
## creates environment "bleeding" using python 3.2 and installs packages from testing.txt using pip
# = SET UP VARIABLES =
# Required version of virtualenv package
VERSION=1.6.4
# Folder to store your virtual environments
VE_FOLDER='/media/work/environments'
## TODO: not used because I can't concatenate strings in bash
# Folder to store bootstrap (source) versions of virtualenv
BOOTSTRAP_FOLDER='/media/work/environments/bootstrap'
## TODO: not used because I can't concatenate strings in bash
# Folder to store pip requirements files
REQUIREMENTS_FOLDER='/media/work/environments/requirements'
## TODO: not used because I can't concatenate strings in bash
# Base URL for downloading virtualenv source
URL_BASE=http://pypi.python.org/packages/source/v/virtualenv
# Universal environment options
ENV_OPTS='--no-site-packages --distribute'
# $1 is the python interpreter
PYTHON=$1
# $2 is the target folder of the new virtual environment
VE_TARGET=$2
# $3 is the pip requirements file
REQ_TARGET=$3
## = DOWNLOAD VIRTUALENV SOURCE =
## I work offline so I already have this downloaded
## and I leave this bit commented out
# cd $BOOTSTRAP_DIR
# curl -O $URL_BASE/virtualenv-$VERSION.tar.gz
## or use wget
# = CREATE NEW ENV USING VIRTUALENV SOURCE =
cd $BOOTSTRAP_FOLDER
tar xzf virtualenv-$VERSION.tar.gz
# Create the environment
$PYTHON virtualenv-$VERSION/virtualenv.py $ENV_OPTS $VE_TARGET
# Don't need extracted version anymore
rm -rf virtualenv-$VERSION
# Activate new environment
cd $VE_TARGET
. bin/activate
# = INSTALL A PIP REQUIREMENTS FILE =
## uncomment this if you want to automatically install a file
# pip install -r $REQ_TARGET
# = REPORT ON THE NEW ENVIRONMENT =
python --version
pip freeze
# deactivate
## uncomment this if you don't want to start in your environment immediately
输出看起来像这样(下载关闭,停用打开):
<>之前user@computer:美元/home/user。Env_create python3/media/work/environments/test新的python可执行文件/media/work/environments/test/bin/python3同时在/media/work/environments/test/bin/python中创建可执行文件安装分发 ............... 完成了。pip安装 ............... 完成了。Python 3.2分发= = 0.6.19wsgiref = = 0.1.2user@computer:美元/测试/媒体/工作/环境注意到@j.f。Sebastian, virtualenvwrapper可以完成您所要求的大部分或全部功能。
http://virtualenvwrapper.readthedocs.org/virtualenvwrapper是Ian Bicking的virtualenv的一组扩展工具。扩展包括用于创建和删除的包装器虚拟环境和管理你的开发工作流程,让你更容易同时处理多个项目,而不需要在依赖关系中引入冲突。
详细说明JF Sebastian和nealmcb的贡献,这些天我确实使用我的系统打包版本的virtualenvwrapper(在Ubuntu 12.04和更高版本上可用)。
virtualenvwrapper是Ian Bicking的虚拟环境工具的一组扩展。这些扩展包括用于创建和删除虚拟环境的包装器,以及管理您的开发工作流,使得一次在多个项目上工作更容易,而不会在它们的依赖关系中引入冲突。
我使用的关键特性(在回答这个问题时)是:
-
mkvirtualenv --python=PYTHON_EXE
使用特定的Python可执行文件(不一定是系统打包的版本)创建虚拟环境 - 连接到pip的虚拟环境支持
-
allvirtualenv pip install -U pip
在所有虚拟环境中升级pip
JFS提到的环境变量确实很有用:PIP_DOWNLOAD_CACHE, virtualenv_use_distribution, WORKON_HOME, VIRTUALENVWRAPPER_PYTHON。
更新virtualenv本身的唯一原因是获得最新版本的setuptools(以前称为Distribute,以前称为setuptools)。我还没有需要这样做,但我怀疑从一个新的虚拟环境开始,首先升级Distribute/setuptools,然后升级pip,然后安装其他库是最简单的。
如果virtualenv的新版本是绝对必要的,应该修改引导脚本。