短的问题

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

背景

在我对SO问题4314376的回答中,我建议使用ez_setup,这样你就可以像下面这样安装pip和virtualenv:

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 ?我喜欢保持一个干净的全局site-packages目录的想法,所以我在那里安装的其他包只有virtualenvwrapper和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问题4314376的回答的评论中,SO用户Glyph表示:

不。永远不要使用sudo python setup.py安装任何东西。编写~/.pydistutils.cfg文件,将pip安装放在~/目录下。本地的或者其他的。特别是名为ez_setup.py的文件往往会占用setuptools和easy_install等新版本的东西,这可能会破坏操作系统上的其他东西。

回到那个简短的问题

所以,Glyph的回答让我想到了我最初的问题:

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


当前回答

我认为Glyph的意思是这样做:

Create a directory ~/.local, if it doesn't already exist. In your ~/.bashrc, ensure that ~/.local/bin is on PATH and that ~/.local is on PYTHONPATH. Create a file ~/.pydistutils.cfg which contains [install] prefix=~/.local It's a standard ConfigParser-format file. Download distribute_setup.py and run python distribute_setup.py (no sudo). If it complains about a non-existing site-packages directory, create it manually: mkdir -p ~/.local/lib/python2.7/site-packages/ Run which easy_install to verify that it's coming from ~/.local/bin Run pip install virtualenv Run pip install virtualenvwrapper Create a virtual env containing folder, say ~/.virtualenvs In ~/.bashrc add export WORKON_HOME source ~/.local/bin/virtualenvwrapper.sh

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

其他回答

如果你遵循我在这个答案中链接的几个教程中建议的步骤,你就会 就能得到想要的效果,而不需要沃克和维奈回答中有些复杂的“手动”步骤。如果你用的是Ubuntu:

sudo apt-get install python-pip python-dev

在OS X中,通过使用自制程序安装python可以实现相同的功能(更多细节请点击此处)。

brew install python

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

sudo pip install virtualenvwrapper

(这些是你唯一需要在全球安装的包,我怀疑它会与任何系统级的操作系统发生冲突。如果你想要超级安全,你可以保留发行版的版本

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

然后追加到.bashrc文件

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

来源

. ~/.bashrc

基本上就是这样。现在唯一需要决定的是是否要创建一个virtualenv来包含系统级包

mkvirtualenv --system-site-packages foo

现有的系统包不需要重新安装,它们被符号链接到系统解释器的版本。注意:你仍然可以在没有sudo的情况下安装新的包和升级现有的系统包-我测试了它,它可以在没有任何系统解释器中断的情况下工作。

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,在那里您可以自由而缓慢地安装您最喜欢的软件包

pip install flask

我在安装升级的SSL模块时遇到了各种问题(见下文),甚至是在virtualenv中,在旧的操作系统提供的Python版本上安装,所以我现在使用pyenv。

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

在Mac上,输入brew install pyenv,在Linux上,使用pyenv installer 这为你提供了内置的virtualenv支持以及Python版本切换(如果需要) 适用于python2或python3,可以同时安装多个版本

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

一些不错的教程:

使用pyenv和virtualenv——在选择Python版本时,使用pyenv global 3.9.1(对当前用户来说是全局的)或pyenv local 3.6.3(对当前目录来说是本地的)更容易。 Pyenv基础知识,并与virtualenv一起使用

pyenv-virtualenv插件现在是内置的- type pyenv命令| grep virtualenv检查。我不会一开始就使用pyenv- virtualenenv插件——看看你如何使用pyenv-virtualenv插件,它更集成到pyenv中,因为它涵盖了virtualenvwrapper所做的大部分工作。

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

pyenv与名称非常相似的pyvenv无关——pyvenv是一个虚拟的env,是最近Python 3版本的一部分,并且不处理Python版本切换

警告

关于pyenv的两个警告:

它只能从bash或类似的shell中工作-或者更具体地说,pyenv-virtualenv插件不喜欢dash,它在Ubuntu或Debian上是/bin/sh。 它必须从交互式登录shell运行(例如bash—使用终端登录),这并不总是容易实现自动化工具,如Ansible。

因此,pyenv最适合交互使用,不太适合脚本服务器。

旧的发行版—SSL模块问题

使用pyenv的一个原因是,在使用较旧的系统提供的Python版本时,升级Python SSL模块经常会出现问题。由于当前的Linux发行版支持Python 3.x,这可能不是什么问题。

下面是一种安装virtualenvwrapper的好方法。

下载virtualenv-1.11.4(你可以在这里找到最新版本),解压,打开终端

# 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 env1, lsvirtualenv ..等

注意:可以在“下载”文件夹中删除virtualenv-1.11.4和virtualenv-1.11.4.zip。

你不需要在python中安装任何东西就可以做到这一点。 你不需要sudo或任何特权。 您不需要找到virtualenv tar文件的最新版本 您不需要在bash脚本中编辑版本信息以保持更新。 您不需要安装curl/wget或tar,也不需要安装pip或easy_install 这适用于2.7和3。X

将以下文件保存到“/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
    tar_found = False
    url = None
    sha256 = None
    for line in f.read().splitlines():
        if isinstance(line, bytes):
            line = line.decode('utf-8')
        if tar_found:
            if 'sha256' in line:
                sha256 = line.split('data-clipboard-text')[1].split('"')[1]
                break
            continue
        if not tar_found and 'tar.gz">' not in line:
            continue
        tar_found = True
        for url in line.split('"'):
            if url.startswith('https'):
                break
    else:
        print('tar.gz not found')
        sys.exit(1)
    file_name = url.rsplit('/', 1)[1]
    print(file_name)
    os.chdir(tmp_dir)
    data = urlopen(url).read()
    data_sha256 = hashlib.sha256(data).hexdigest()
    if sha256 != data_sha256:
        print('sha256 not correct')
        print(sha256)
        print(data_sha256)
        sys.exit(1)
    with open(file_name, 'wb') as fp:
        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]

例如(如果你真的需要setuptools的分发兼容层)

python /tmp/initvenv.py venv distribute

请注意,对于较旧的python版本,这可能会给你InsecurePlatformWarnings¹。

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

venv/bin/virtualenv venv2

# # virtualenvwrapper

我建议在一次设置之后,看看virtualenvwrapper:

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

激活(可以从您的登录脚本完成):

% 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)% 

¹我还没有找到抑制警告的方法。它可以在pip和/或请求中解决,但开发人员相互指向原因。我得到了一个通常不现实的建议,把我正在使用的python版本升级到最新版本。我相信这将打破例如我的Linux Mint 17安装。幸运的是,pip缓存了包,所以发出了警告 每次安装只需要一次。

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