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

What's the proper way to install pip, virtualenv, and distribute for Python?

简短问题

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

背景

在回答第4314376号问题时,我建议您使用ez_setup,以便安装pipvirtualenv,如下所示:

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

我最初从JesseNoller的博客文章中提取了这些说明,所以你想在Mac上使用Python吗?.I喜欢保持一个干净的全局站点包目录,所以我安装的其他包只有virtualenvwrapperdistribute。(最近我把distribute添加到我的工具箱中,因为这次发布了Python公共服务。为了安装这两个软件包,我使用了:

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

没有更多的设置工具和易于安装

为了真正遵循Python公共服务声明,在新安装的Python上,我将执行以下操作:

1
2
3
4
5
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

雕文的斥责

在对我回答的问题4314376的评论中,用户glyph指出:

NO. NEVER EVER do sudo python setup.py install whatever. Write a ~/.pydistutils.cfg that puts your pip installation into ~/.local or something. Especially files named ez_setup.py tend to suck down newer versions of things like setuptools and easy_install, which can potentially break other things on your operating system.

回到简短的问题

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

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


您可以在不向Python本身安装任何东西的情况下完成此操作。

你不需要sudo或任何特权。

您不需要编辑任何文件。

将virtualenv安装到引导虚拟环境中。使用该虚拟环境创建更多。因为virtualenv附带了pip和distribute,所以您可以从一次安装中获得一切。

  • 下载virtualenv:
    • http://pypi.python.org/pypi/virtualenv
    • https://pypi.python.org/packages/source/v/virtualenv/virtualenv-12.0.7.tar.gz(或最新版本!)
  • 打开源tarball
  • 使用未打包的tarball创建一个干净的虚拟环境。这个虚拟环境将用于"引导"其他人。所有虚拟环境都将自动包含PIP和Distribute。
  • 使用pip,将virtualenv安装到引导环境中。
  • 使用引导环境创建更多!
  • 下面是bash中的一个示例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 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

    现在,您可以使用"引导"环境创建更多:

    1
    2
    3
    4
    # 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的版本,--distribute)。现在,您可以只使用python virtualenv.py path-to-bootstrappython3 virtualenv.py path-to-bootstrap来创建引导环境。


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

  • 如果目录~/.local不存在,则创建该目录。
  • 在你的~/.bashrc中,确保~/.local/binPATH上,~/.localPYTHONPATH上。
  • 创建一个文件~/.pydistutils.cfg,其中包含

    1
    2
    [install]
    prefix=~/.local

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

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

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

  • 运行which easy_install验证它是否来自~/.local/bin

  • 运行pip install virtualenv
  • 运行pip install virtualenvwrapper
  • 创建一个包含虚拟env的文件夹,比如~/.virtualenvs
  • ~/.bashrc中增加

    1
    2
    export WORKON_HOME
    source ~/.local/bin/virtualenvwrapper.sh
  • 就是这样,根本不使用sudo,而您的python环境在~/.local中,完全独立于操作系统的python。免责声明:不确定virtualenvwrapper在这种情况下有多兼容-我不能在我的系统上测试它-)


    如果您按照我在这个答案中链接的几个教程中建议的步骤操作,那么在沃克和维尼的回答中,不需要一些复杂的"手动"步骤就可以达到预期的效果。如果你在Ubuntu上:

    1
    sudo apt-get install python-pip python-dev

    在OSX中,通过使用自制安装python(此处提供更多详细信息)实现了等效功能。

    1
    brew install python

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

    1
    sudo pip install virtualenvwrapper

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

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

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

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

    来源于

    1
    . ~/.bashrc

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

    1
    mkvirtualenv --system-site-packages foo

    如果不必重新安装现有的系统包,它们将与系统解释器的版本符号链接。注意:在没有sudo-i测试的情况下,您仍然可以安装新的软件包并从系统软件包升级现有的软件包,并且它可以在不中断系统解释器的情况下工作。

    1
    2
    3
    4
    5
    6
    7
    8
    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

    如果您想要一个完全分离的环境,另一种选择是

    1
    mkvirtualenv --no-site-packages bar

    或者考虑到这是默认选项,

    1
    mkvirtualenv bar

    其结果是,您有了一个新的virtualenv,您可以在其中自由地和意外地安装您喜爱的软件包。

    1
    pip install flask


    python 3.4以后

    python 3.3添加了venv模块,python 3.4添加了ensurepip模块。这使得引导PIP简单到:

    python -m ensurepip

    可能在调用venv在虚拟环境中这样做之前。

    保证PIP见PEP 453。


    关于Ubuntu:

    sudo apt-get install python-virtualenv

    python-pip是一个依赖项,因此也将安装它。


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

    pythonbrew是Python的版本管理器,支持virtualenv。

    在安装pythonbrew和使用venvs的python版本之后,非常容易:

    1
    2
    3
    4
    5
    6
    7
    8
    # Initializes the virtualenv
    pythonbrew venv init

    # Create a virtual/sandboxed environment
    pythonbrew venv create mycoolbundle  

    # Use it
    pythonbrew venv use mycoolbundle


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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    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.

    安全意识的要点:

  • curl执行SSL验证。WGET没有。
  • 从PIP 1.3.1开始,PIP还进行SSL验证。
  • 与Github tarball相比,可以上传pypi tarball的用户更少。

  • 安装ActivePython。它包括pip、virtualenv和distribute。


    如果您确定要安装sudo python setup.py,那么安装它没有问题。

    不同之处在于,它将使用操作系统的site packages目录作为要复制的.py文件的目标。

    因此,如果您希望PIP在操作系统范围内是可访问的,那么这可能是一个可行的方法。我不是说别人的方式不好,但这可能是足够公平的。


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

    pyenv使安装新的python版本非常容易,并且支持virtualenv。开始要比其他答案中列出的virtualenv配方容易得多:

    • 在Mac上键入brew install pyenv,在Linux上使用pyenv安装程序
    • 这将使您获得内置的virtualenv支持以及python版本切换(如果需要)
    • 适用于python 2或3,可以同时安装多个版本

    这对于将"新python"版本和virtualenv与系统python隔离开来非常有效。因为您可以很容易地使用更新的python(post 2.7.9),所以ssl模块已经升级了,当然,与任何现代virtualenv设置一样,您与系统python模块是隔离的。

    一些不错的教程:

    • 使用pyenv和virtualenv-选择python版本时,更容易使用EDOCX1(全局到当前用户)或EDOCX1(本地到当前目录)。
    • pyenv基础知识和与virtualenv一起使用

    pyenv-virtualenv插件现在内置于类型pyenv commands | grep virtualenv中进行检查。我不会从pyenv virtualenvwrapper插件开始-看看你是如何使用pyenv virtualenv的,后者更集成到pyenv中,因为这涵盖了virtualenvwrapper的大部分功能。

    pyenv是在rbenv上建模的(一个很好的Ruby版本转换工具),它唯一的依赖项是bash。

    • pyenv与非常相似的名称pyvenv无关,它是一个virtualenv等价物,是最新的python3版本的一部分,不处理python版本切换。

    告诫

    关于pyenv的两个警告:

  • 它只适用于bash或类似的shell——或者更具体地说,pyenv virtualenv插件不喜欢dash,它在ubuntu或debian上是/bin/sh
  • 它必须从交互式登录shell(例如使用终端的bash --login)运行,而使用诸如ansible之类的自动化工具并不总是容易实现的。
  • 因此,pyenv最适合交互式使用,而不适合脚本服务器。

    SSL模块问题

    使用pyenv的一个原因是,在使用旧系统提供的python版本时,升级python ssl模块通常会出现问题:

    • Ubuntu14.04包括python2.7.6,它需要相当大的努力将其升级到正确的SSL模块,以便将sni(服务器名称指示)作为客户端进行处理。(我为此写了一些可解释的剧本,这很痛苦,在某些情况下还是破的。)
    • 升级的ssl模块将更为重要,因为python.org网站仅在2017年和2018年迁移到tls 1.2。

    • 您可以在不向Python本身安装任何东西的情况下完成此操作。

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

    • 你不需要找到最新版本的virtualenvtar文件

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

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

    • 这适用于2.7和3.x

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

    从未来导入打印功能

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    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

    并用它作为

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

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

    1
    python /tmp/initvenv.py venv distribute

    请注意,对于旧的python版本,这可能会给您提供InsecurePlatformWarnings1。

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

    1
    venv/bin/virtualenv venv2

    虚拟环境包装

    我建议在一次性设置之后,也查看一下virtualenvwrapper:

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

    和激活(可以从登录脚本中完成):

    1
    % source venv/bin/virtualenvwrapper.sh

    你可以这样做:

    1
    2
    3
    4
    5
    % 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)%

    1我没有找到抑制警告的方法。它可以在pip和/或request中解决,但开发人员互相指出原因。我得到了将我使用的Python版本升级到最新版本的建议,这通常是不现实的。我确信这会破坏我的Linux Mint 17安装。幸运的是,pip缓存包,因此发出警告每个软件包仅安装一次。


    我最近遇到了同样的问题。我越来越偏爱"总是使用virtualenv"的思想,所以我的问题是安装virtualenv和pip,而不安装distribute到我的全局或用户站点包目录。为此,我手动下载了distribute、pip和virtualenv,并为每个脚本运行了"python setup.py install--prefix~/.local/python private"(临时设置pythonpath=~/.local/python private),以便安装脚本能够找到distribute)。我已经将virtualenv脚本移到了路径上的另一个目录,并对其进行了编辑,以便可以在sys.path上找到distribute和virtualenv模块。我没有安装任何东西到/usr、/usr/local或我的用户站点包dir,但是我可以在任何地方运行virtualenv,在virtualenv中我得到pip。


    好消息是,如果已安装python3.4,则pyvenv已安装。所以,只是

    1
    2
    3
    4
    pyvenv project_dir
    source project_dir/bin/activate
    python --version  
    python 3.4.*

    现在,在这个虚拟环境中,您可以使用PIP为这个项目安装模块。

    离开这个虚拟环境,只是

    1
    deactivate

    下面是安装virtualenvwrapper的一个好方法(更新此方法)。

    下载virtualenv-1.11.4(您可以在这里找到最新信息),解压它,打开terminal

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 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等。

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


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

    基本上,我做的是用sudo easy_install pip安装pip,然后使用sudo pip install virtualenv,然后用virtualenv my_env创建一个环境,然后我做的是:virtualenv --distribute my_env;在我的virtualenv中安装distributepip

    同样,请遵循virtualenv页上的说明。

    有点麻烦,来自Ruby;p