什么是安装pip,virtualenv和为Python分发的正确方法?

简短的问题

  • 安装pipvirtualenvdistribute的正确方法是什么?

背景

在我对SO问题4314376的 回答中,我推荐使用ez_setup这样你就可以像下面这样安装pipvirtualenv了:

 curl -O http://peak.telecommunity.com/dist/ez_setup.py sudo python ez_setup.py sudo easy_install pip sudo pip install virtualenv 

我最初从Jesse Noller的博客文章中提取这些说明所以你想在Mac上使用Python? 。 我喜欢保持一个干净的全球站点包目录的想法,所以我安装的唯一的其他软件包是virtualenvwrapperdistribute 。 (我最近添加了distribute到我的工具箱,因为这个Python的公共服务公告 。要安装这两个包,我使用:

 sudo pip install virtualenvwrapper curl -O http://python-distribute.org/distribute_setup.py sudo python distribute_setup.py 

没有更多的setuptools和easy_install

要真正遵循Python公共服务公告 ,在新鲜的Python安装中,我会执行以下操作:

 curl -O http://python-distribute.org/distribute_setup.py sudo python distribute_setup.py sudo easy_install pip sudo pip install virtualenv sudo pip install virtualenvwrapper 

雕文的斥责

SO用户Glyph在对SO问题4314376的 回答中表示:

没有。 永远不要sudo python setup.py install任何东西。 写一个〜/ .pydistutils.cfg,把你的pip安装到〜/ .local或其他东西里。 特别是名为ez_setup.py文件往往会吸收像setuptools和easy_install这样的更新版本,这可能会破坏操作系统上的其他内容。

回到简短的问题

所以雕文的回答让我回到我原来的问题:

  • 安装pipvirtualenvdistribute的正确方法是什么?

你可以做到这一点,而无需安装任何东西到Python本身。

你不需要sudo或任何特权。

你不需要编辑任何文件。

将virtualenv安装到引导虚拟环境中。 使用该虚拟环境来创build更多。 由于virtualenv附带点和发行,你从一个安装得到的一切。

  1. 下载virtualenv:
  2. 解压源码包
  3. 使用解压后的tarball创build一个干净的虚拟环境。 这个虚拟环境将被用来“引导”他人。 所有的虚拟环境将自动包含点和分发。
  4. 使用pip,将virtualenv安装到该引导环境中。
  5. 使用该引导环境来创build更多!

这里是bash中的一个例子:

 # Select current version of virtualenv: VERSION=12.0.7 # Name your first "bootstrap" environment: INITIAL_ENV=bootstrap # Set to whatever python interpreter you want for your first environment: PYTHON=$(which python) URL_BASE=https://pypi.python.org/packages/source/v/virtualenv # --- Real work starts here --- curl -O $URL_BASE/virtualenv-$VERSION.tar.gz tar xzf virtualenv-$VERSION.tar.gz # Create the first "bootstrap" environment. $PYTHON virtualenv-$VERSION/virtualenv.py $INITIAL_ENV # Don't need this anymore. rm -rf virtualenv-$VERSION # Install virtualenv into the environment. $INITIAL_ENV/bin/pip install virtualenv-$VERSION.tar.gz 

现在,您可以使用“引导”环境来创build更多:

 # Create a second environment from the first: $INITIAL_ENV/bin/virtualenv py-env1 # Create more: $INITIAL_ENV/bin/virtualenv py-env2 

发疯!

注意

这假设你没有使用真正的旧版本的virtualenv。 旧版本需要标志--no-site-packges (并根据Python的版本, – 分布)。 现在你可以使用python virtualenv.py path-to-bootstrappython3 virtualenv.py path-to-bootstrap来创build引导环境。

我认为字形意味着做这样的事情:

  1. 创build一个目录~/.local ,如果它不存在的话。
  2. ~/.bashrc ,确保~/.local/binPATH ,而~/.localPYTHONPATH
  3. 创build一个包含的文件~/.pydistutils.cfg

     [install] prefix=~/.local 

    这是一个标准的ConfigParser格式的文件。

  4. 下载 distribute_setup.py并运行python distribute_setup.py (没有sudo )。 如果它抱怨一个不存在的site-packages目录,请手动创build它:

    mkdir -p〜/ .local / lib / python2.7 / site-packages /

  5. 运行which easy_install来validation它来自~/.local/bin

  6. 运行pip install virtualenv
  7. 运行pip install virtualenvwrapper
  8. 创build一个虚拟的env包含文件夹,说~/.virtualenvs
  9. ~/.bashrc添加

     export WORKON_HOME source ~/.local/bin/virtualenvwrapper.sh 

就这样,根本不使用sudo ,你的Python环境在~/.local ,完全独立于操作系统的Python。 免责声明:不确定如何兼容virtualenvwrapper在这种情况下 – 我无法在我的系统上testing:-)

如果按照我在这个答案中链接的几个教程中build议的步骤,可以在Walker和Vinay的答案中没有复杂的“手动”步骤的情况下获得所需的效果。 如果你在Ubuntu上:

 sudo apt-get install python-pip python-dev 

相当于OS X通过使用自制软件来安装python(更多细节在这里 )。

 brew install python 

安装pip ,可以使用它来获取剩余的包(在使用本地python安装时,可以省略OS X中的sudo )。

 sudo pip install virtualenvwrapper 

(这些是你需要在全局安装的唯一的软件包,我怀疑它会与操作系统的任何系统级别发生冲突,如果你想超级安全,你可以保留发行版本sudo apt-get install virtualenvwrapper

注意:在Ubuntu 14.04中,我收到了一些使用pip install的错误 ,所以我使用pip3 install virtualenv virtualenvwrapper并将VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3到我的.bashrc/.zshrc文件中。

然后您附加到您的.bashrc文件

 export WORKON_HOME source /usr/local/bin/virtualenvwrapper.sh 

并来源

 . ~/.bashrc 

这基本上是这样。 现在唯一的决定是你是否想创build一个virtualenv来包含系统级的包

 mkvirtualenv --system-site-packages foo 

您现有的系统软件包不需要重新安装,它们被链接到系统解释器的版本。 注意:你仍然可以安装新的软件包并升级现有的包含系统软件包而不用sudo – 我testing了它,并且没有任何系统解释器的中断。

 kermit@hocus-pocus:~$ sudo apt-get install python-pandas kermit@hocus-pocus:~$ mkvirtualenv --system-site-packages s (s)kermit@hocus-pocus:~$ pip install --upgrade pandas (s)kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)" 0.10.1 (s)kermit@hocus-pocus:~$ deactivate kermit@hocus-pocus:~$ python -c "import pandas; print(pandas.__version__)" 0.8.0 

另一种方法是,如果你想要一个完全分离的环境,

 mkvirtualenv --no-site-packages bar 

或者说这是默认选项

 mkvirtualenv bar 

其结果是,你有一个新的virtualenv,你可以自由和sudolessly安装你最喜欢的软件包

 pip install flask 

Python 3.4以上

Python 3.3增加了venv模块 ,Python 3.4添加了ensurepip模块 。 这使得引导点很容易:

python -m ensurepip

也许在虚拟环境中调用venv来完成。

保证点在PEP 453中有描述。

在Ubuntu上:

sudo apt-get install python-virtualenv

python-pip包是一个依赖项,所以它也会被安装。

更新:截至2013年7月,该项目不再维护。 作者build议使用pyenv 。 (pyenv没有对virtualenv的内置支持,但是很好用。)

Pythonbrew是Python的版本pipe理器,并支持virtualenv。

在使用venvs安装pythonbrew和python版本之后非常简单:

 # Initializes the virtualenv pythonbrew venv init # Create a virtual/sandboxed environment pythonbrew venv create mycoolbundle # Use it pythonbrew venv use mycoolbundle 

我做了这个程序让我们在工作中使用。

 cd ~ curl -s https://pypi.python.org/packages/source/p/pip/pip-1.3.1.tar.gz | tar xvz cd pip-1.3.1 python setup.py install --user cd ~ rm -rf pip-1.3.1 $HOME/.local/bin/pip install --user --upgrade pip distribute virtualenvwrapper # Might want these three in your .bashrc export PATH=$PATH:$HOME/.local/bin export VIRTUALENVWRAPPER_VIRTUALENV_ARGS="--distribute" source $HOME/.local/bin/virtualenvwrapper.sh mkvirtualenv mypy workon mypy pip install --upgrade distribute pip install pudb # Or whatever other nice package you might want. 

安全思想要点:

  1. curl做sslvalidation。 wget没有。
  2. 从pip 1.3.1开始,pip也做sslvalidation。
  3. 较less的用户可以上传pypi tarball而不是github tarball。

如果你确定这是你想做的事情,sudo python setup.py install是没有问题的。

不同的是,它将使用您的操作系统的site-packages目录作为要复制的.py文件的目标。

所以,如果你想让pip可以在任何地方访问,那可能就是要走的路。 我不是说别人的方式不好,但这可能够公平的。

安装ActivePython 。 它包括pip,virtualenv和Distribute。

我最近遇到了同样的问题。 我越来越偏向于“总是使用virtualenv”的思维模式,所以我的问题是使用pip安装virtualenv,而不安装到我的全局或用户网站包目录。 为了做到这一点,我手动下载了发行版,pip和virtualenv,并为每一个我运行“python setup.py install –prefix〜/ .local / python-private”(临时设置为PYTHONPATH =〜/ .local / python-private),以便安装脚本能够find分发)。 我已经将virtualenv脚本移动到我在PATH中的另一个目录中,并对其进行了编辑,以便在sys.path上finddistribute和virtualenv模块。 Tada:我没有安装任何东西到/ usr,/ usr / local或我的用户site-packages目录,但是我可以在任何地方运行virtualenv,在那个virtualenv我得到pip。

  • 你可以做到这一点,而无需安装任何东西到Python本身。

  • 你不需要sudo或任何特权。

  • 您不需要查找virtualenv tar文件的最新版本

  • 您不需要在bash脚本中编辑版本信息以保持最新状态。

  • 您不需要安装curl / wgettar ,也不需要pipeasy_install

将以下内容保存到/tmp/initvenv.py

 from __future__ import print_function import os, sys, shutil, tempfile, subprocess, tarfile, hashlib try: from urllib2 import urlopen except ImportError: from urllib.request import urlopen tmp_dir = tempfile.mkdtemp(prefix='initvenv_') try: # read the latest version from PyPI f = urlopen("https://pypi.python.org/pypi/virtualenv/") # retrieve the .tar.gz file for line in f.read().splitlines(): if isinstance(line, bytes): line = line.decode('utf-8') if 'tar.gz<' not in line: continue for url in line.split('"'): if url.startswith('http'): url, md5 = url.split('#') assert md5.startswith('md5=') md5 = md5[4:] break else: continue break else: print('tar.gz not found') sys.exit(1) file_name = url.rsplit('/', 1)[1] print(file_name) # url = "https://pypi.python.org/packages/source/v/virtualenv/" + file_name os.chdir(tmp_dir) with open(file_name, 'wb') as fp: data = urlopen(url).read() data_md5 = hashlib.md5(data).hexdigest() if md5 != data_md5: print('md5 not correct') print(md5) print(data_md5) sys.exit(1) fp.write(data) tar = tarfile.open(file_name) tar.extractall() tar.close() os.chdir(file_name.replace('.tar.gz', '')) print(subprocess.check_output([sys.executable, 'virtualenv.py'] + [sys.argv[1]]).decode('utf-8'), end='') if len(sys.argv) > 2: print(subprocess.check_output([ os.path.join(sys.argv[1], 'bin', 'pip'), 'install', 'virtualenv'] + sys.argv[2:]).decode('utf-8'), end='') except: raise finally: shutil.rmtree(tmp_dir) # always clean up 

并将其用作

 python_binary_to_use_in_venv /tmp/initvenv.py your_venv_name [optional packages] 

例如(如果你确实需要setuptoolsdistribute兼容层)

 python /tmp/initvenv.py venv distribute 

请注意,使用较老的python版本,这可能会给你InsecurePlatformWarning

一旦你有了virtualenv(比如venv ),你可以使用刚安装的virtualenv来设置另一个virtualenv:

 venv/bin/virtualenv venv2 

virtualenvwrapper

我build议看看virtualenvwrapper以及一次设置后:

 % /opt/python/2.7.10/bin/python /tmp/initvenv.py venv virtualenvwrapper 

和激活(可以从您的login脚本完成):

 % source venv/bin/virtualenvwrapper.sh 

你可以做这样的事情:

 % mktmpenv New python executable in tmp-17bdc3054a46b2b/bin/python Installing setuptools, pip, wheel...done. This is a temporary environment. It will be deleted when you run 'deactivate'. (tmp-17bdc3054a46b2b)% 

¹ 我还没有find一个压制警告的方法。 它可以通过pip和/或request来解决,但是开发人员指向对方是原因。 我得到了,通常不现实的build议,以升级我使用的最新版本的Python版本。 我相信这会打破例如我的Linux Mint 17安装。 幸运的是pipcaching包,所以每个包安装只发出一次警告。

我有很多问题(见下文),安装升级后的SSL模块,甚至是在virtualenv里面,在较旧的操作系统提供的Python版本之上,所以我现在使用pyenv

pyenv使安装新的Python版本变得非常简单,并且支持virtualenvs。 入门比在其他答案中列出的virtualenv的食谱容易得多:

  • 在Mac上,键入brew install pyenv并在Linux上使用pyenv-installer
  • 这可以让你内buildvirtualenv支持以及Python版本切换(如果需要的话)
  • 与Python 2或3一起运行良好,可以一次安装多个版本

这很好地将系统Python的“新Python”版本和virtualenv隔离开来。 因为您可以轻松使用更新的Python(2.7.9之后版本),所以SSL模块已经升级了,当然,像任何现代的virtualenv设置一样,您已经与系统Python模块隔离了。

几个很好的教程:

  • 使用pyenv和virtualenv – selectPython版本时,使用pyenv global 3.6.1 (全局到当前用户)或pyenv local 2.7.13 (local到当前目录)更容易。
  • pyenv基础和使用virtualenv

pyenv-virtualenv插件现在内置在typespyenv commands | grep virtualenv pyenv commands | grep virtualenv来检查。 我不会使用pyenv-virtualenvwrapper插件开始 – 看看如何与pyenv-virtualenv进行更好的融合,因为这涵盖了virtualenvwrapper的大部分function。

pyenv是用rbenv (一个用于Ruby版本切换的好工具)build模的,它唯一的依赖是bash。

  • pyenv与pyvenv非常相似 – 这是一个相当于virtualenv的Python,它是Python 3最新版本的一部分,不能处理Python版本切换

注意事项

关于pyenv的两个警告:

  1. 它只能从bash或类似的shell运行 – 或者更具体地说,pyenv-virtualenv插件不喜欢在Ubuntu或Debian上是/bin/sh dash
  2. 它必须从交互式loginshell(例如使用terminal的bash --login )运行,而使用Ansible等自动化工具并不总是很容易实现。

因此,pyenv最适合交互式使用,对于脚本服务器来说不太好。

SSL模块问题

使用pyenv一个原因是在使用较老的系统提供的Python版本时,升级Python SSL模块经常会遇到问题:

  • Ubuntu 14.04 包含Python 2.7.6 , 需要付出相当大的努力将其升级到正确的SSL模块,以便作为客户端处理SNI(服务器名称指示)。 (我为此写了一些Ansible脚本,这个脚本很痛苦,在某些情况下还是打破了。)
  • 升级后的SSL模块将变得更加重要,因为Python.org网站仅在2017年和2018年才转移到TLS 1.2 。

在Virtualenv官方网站上有很好的说明。 https://pypi.python.org/pypi/virtualenv

基本上我所做的就是用sudo easy_install pip安装pip ,然后用sudo pip install virtualenv然后用下面的sudo pip install virtualenv创build一个环境: virtualenv my_env (把它命名为你想要的),接下来我做了: virtualenv --distribute my_env ; 安装在我的virtualenv distribute和点击。

再次,按照virtualenv页面上的说明。

来自Ruby的一种麻烦; P

这里是安装virtualenvwrapper(更新这个 )的好方法。

下载virtualenv-1.11.4 (你可以在这里find最新的),解压缩,打开terminal

 # Create a bootstrapenv and activate it: $ cd ~ $ python <path to unzipped folder>/virtualenv.py bootstrapenv $ source bootstrapenv/bin/activate # Install virtualenvwrapper: $ pip install virtualenvwrapper $ mkdir -p ~/bootstrapenv/Envs # append it to file `.bashrc` $ vi ~/.bashrc source ~/bootstrapenv/bin/activate export WORKON_HOME=~/bootstrapenv/Envs source ~/bootstrapenv/bin/virtualenvwrapper.sh # run it now. $ source ~/.bashrc 

就是这样,现在你可以用mkvirtualenv env1lsvirtualenv

注意:您可以从Downloads文件夹中删除virtualenv-1.11.4virtualenv-1.11.4.zip

好消息是如果你已经安装了python3.4,pyvenv已经被安装了。 所以,只是

 pyvenv project_dir source project_dir/bin/activate python --version python 3.4.* 

现在在这个虚拟env中,你可以使用pip为这个项目安装模块。

离开这个虚拟env,只是

 deactivate