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


247

简短问题

背景

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吗?。我喜欢保持干净的全局site-packages目录的想法,因此我安装的唯一其他软件包是 virtualenvwrapperand distribute。(distribute由于此Python公共服务公告,我最近添加到了我的工具箱中。要安装这两个软件包,我使用了:

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

没有更多的设置工具和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 install任何事情。编写〜/ .pydistutils.cfg,将您的pip安装放入〜/ .local或其他内容。特别是命名为的文件ez_setup.py往往会吸收诸如setuptools和easy_install之类的较新版本,这可能会破坏操作系统上的其他内容。

回到简短的问题

因此,Glyph的回答使我想到了最初的问题:


马修,我知道这个线程很旧。但是这方面有什么新东西吗?它仍然是一个坏主意,做python distribute_setup.py其次是easy_install pipvirtualenv --distribute venv?(请参阅python-guide.readthedocs.org/en/latest/starting/install/…),如果是,为什么?
Amelio Vazquez-Reina

2
sudo apt-get install python-{pip,virtualenv}??? 怎么了?
MestreLion 2014年

1
是的,当次要版本对您的目的无关紧要时,通常使用较旧但兼容的程序包就可以了,但是您特别询问“问题出在哪里”,而我正在尝试获取我的学步车徽章。

2
仅供参考,在这个问题上的几个环节,现在已经过时/破-我目前(也不能)中看到的对pipvirtualenv和Python的PSA。
克里斯·斯普拉格

1
http://python-distribute.org/distribute_setup.py重定向到404 :(
抖动

Answers:


173

您可以执行此操作而无需在python本身中安装任何东西

您不需要sudo或任何特权。

您无需编辑任何文件。

将virtualenv安装到引导虚拟环境中。使用该虚拟环境创建更多内容。由于virtualenv附带了pip和分发,因此您一次安装即可获得所有内容。

  1. 下载virtualenv:
  2. 解压源压缩包
  3. 使用解压缩的tarball创建干净的虚拟环境。该虚拟环境将用于“引导”其他环境。您的所有虚拟环境将自动包含pip和分发。
  4. 使用pip将virtualenv安装到该引导环境中。
  5. 使用该引导环境创建更多内容!

这是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

现在,您可以使用“引导”环境创建更多内容:

# 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)。现在,您可以使用just python virtualenv.py path-to-bootstrap或来创建引导环境python3 virtualenv.py path-to-bootstrap


13
枯燥乏味的原因仅在于它非常通用,只需简单的下载,解压缩然后python virtualenv.py TARGET_DIRECTORY执行相同的操作。
塞巴斯蒂安·布拉斯克

3
太好了 我适应它回答关于不同的Python的多个版本安装的virtualenv我更具体的问题indpendently系统软件包- stackoverflow.com/questions/6812207/... -完美的作品。
david.libremone 2011年

6
注意:当前virtualenv不需要'--no-site-packages --distribute'选项。--system-site-packages可能需要相反的操作
jfs 2012年

1
您可以使用以下命令获取最新的稳定tarball:curl -Lo virtualenv-tmp.tar.gz 'https://github.com/pypa/virtualenv/tarball/master'
Bohr 2013年

1
您在哪里安装virtualenvwrapper文档特别警告不要将其安装在virtualenv中(尽管它似乎可以正常工作)。
Aryeh Leib Taurog

21

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

  1. 创建目录~/.local(如果尚不存在)。
  2. 在你的~/.bashrc,保证~/.local/binPATH~/.localPYTHONPATH
  3. 创建一个~/.pydistutils.cfg包含以下内容的文件

    [install]
    prefix=~/.local

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

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

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

  5. 运行which easy_install以验证它来自~/.local/bin

  6. pip install virtualenv
  7. pip install virtualenvwrapper
  8. 创建一个包含文件夹的虚拟环境,例如 ~/.virtualenvs
  9. ~/.bashrc添加

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

就是这样,根本不使用sudo任何功能,并且您的Python环境在中~/.local,与操作系统的Python完全分开。免责声明:不确定virtualenvwrapper这种情况下的兼容性-我无法在我的系统上测试它:-)


2
〜/ .local有点笨吗?如果Ruby想做同样的事情怎么办?也许〜/ .python27会更好?
乔纳森·哈特利

1
请注意,我在Windows上尝试了相同的操作,并且必须将本地文件夹(例如称为“ local”)和“ local \ Lib \ site-packages”都添加到PYTHONPATH中,以便成功运行distribute_setup.py。
技术

1
这种方法的最后一个问题:virtualenv与使用.pydistutils.cfg文件不兼容。见github.com/pypa/virtualenv/issues/88

3
我认为easy_install pip步骤5和6之间应该存在一个
SiggyF 2011年

5
〜/ .local的内容来自PEP370。
ÉricAraujo

16

如果您按照我在此答案中链接的若干教程中的建议进行操作,则无需在Walker和Vinay的答案中进行一些复杂的“手动”步骤即可获得所需的效果。如果您使用的是Ubuntu:

sudo apt-get install python-pip python-dev

在OS X中,可以通过使用自制软件安装python来实现等效功能(此处有更多详细信息)。

brew install python

随着pip安装,你可以用它来获得剩余的包(可以省略sudo在OS X,如您使用的Python的安装)。

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

基本上就是这样。现在唯一的决定是是否要创建一个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

这不同时安装setuptools并分发吗?并不会破坏不喜欢setuptools的Tkinter和pyopencl之类的软件包吗?
滚刀

在bashrc中将WORKON_HOME设置为null是否会迫使venvwrapper使用合理的方法export WORKON_HOME="$HOME/.virtualenvs"
滚刀

好了,它会安装您的软件包管理员说的pip所依赖的任何东西。当前,这是Ubuntu和OS X 中的setuptools (brew install python将pip + setuptools引入)。这种方法对我来说很好。另外,专注于pip似乎也是Python封装的未来之路
metakermit

1
WORKON_HOME默认为~/.virtualenvs,是。有一条线/usr/local/bin/virtualenvwrapper.sh,设置workon_home_dir="$HOME/.virtualenvs" if [ "$workon_home_dir" = "" ]
metakermit

得到它了。谢谢。当在pip中安装对使用分发(pyopencl)挑剔的模块时,您的简单方法对Ubuntu 12.04十分有用。对我来说,技巧是在激活的virtualenv中跟踪您的产品pip install virtualenv virtualenv-wrapper线,pip install --upgrade distribute然后在其中安装pyopencl。我还添加export PROJECT_HOME="$HOME/src"了我的bashrc以启用超酷的mkprojectvenv工具。
滚刀

12

从Python 3.4开始

Python 3.3添加了venv模块,Python 3.4添加了surepip模块。这使自举点变得简单:

python -m确保

可能在venv虚拟环境中呼吁这样做之前。

PEP 453中描述了保证的点子。


10

在Ubuntu上:

sudo apt-get install python-virtualenv

该软件包python-pip是一个依赖项,因此也将被安装。


1
python-virtualenv将同时安装virtualenv和pip。之后,只需运行virtualenv即可创建Python虚拟环境。并从虚拟环境中运行pip以安装其他软件包。
jemeshsu

2
这确实是最明智的选择。在操作系统中安装东西的“正确”方法是使用操作系统安装程序系统!在此之后,你可以玩pip的,最好virtualenv,并且从未使用sudo的两种
MestreLion

不幸的是,操作系统提供的版本pip有时会存在重大错误,因此我经常最终使用get-pip.pypython.org上提供的版本。
RichVel

@RichVel您可以详细说明遇到的重大错误吗?
danielpops

1
@danielpops-一个示例是Ubuntu 16.04.1上的此pip问题,但某些版本和用例可能还有其他问题。
RichVel

5

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

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会进行ssl验证。wget没有。
  2. 从pip 1.3.1开始,pip还执行ssl验证。
  3. 与github tarball相比,更少的用户可以上传pypi tarball。

5

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

Pythonbrew是python的版本管理器,并支持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

@ kermit666谢谢。将我的答案标记为过时的首选方式是什么?只是删除它?
kioopi

1
好吧,您可以按原样保留它(有一些使用pyenv的说明供那些关注我评论中链接的人使用,这些概念与您建议的pythonbrew相似),也可以编辑答案,例如使用Update Update 2013 by附加新的说明。也许pythonbrew将来会再次激活,所以我不会删除您的旧说明。有关更多信息,请参见meta
metakermit 2013年

请参阅我关于的答案pyenv,效果很好。
RichVel

3

如果您确定这是您要执行的操作,则执行sudo python setup.py安装没有问题。

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

因此,如果您希望点子在整个范围内都可访问,那可能就是方法。我并不是说其他​​人的方法是不好的,但这可能很公平。


1
是的,我曾经那样。一段时间后,调用使pip freeze我几乎冻结了-在系统范围内安装的软件包列表太长了。从那时起,我强烈建议您使用“ no sudo”和“ no os-wide” python软件包安装。
Jan Vlcinsky


2

我最近遇到了同样的问题。我越来越偏爱“始终使用virtualenv”的心态,所以我的问题是使用pip安装virtualenv,而没有将distribution安装到我的全局目录或用户site-packages目录中。为此,我手动下载了distribute,pip和virtualenv,然后为每个文件运行“ python setup.py install --prefix〜/ .local / python-private”(临时设置为PYTHONPATH =〜/ .local / python-private),以便安装脚本能够找到分发)。我已经将virtualenv脚本移到了我在PATH上的另一个目录中,并对其进行了编辑,以便可以在sys.path上找到分发和virtualenv模块。Tada:我没有在/ usr,/ usr / local或用户站点软件包目录中安装任何东西,但是我可以在任何地方运行virtualenv,在该virtualenv中我得到了pip。



2

在较旧的操作系统提供的Python版本之上,即使在virtualenv中也安装了升级的SSL模块时,我遇到了各种各样的问题(请参阅下文),所以我现在使用pyenv

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

  • 在Mac上,键入brew install pyenv,在Linux上,使用pyenv-installer
  • 这将为您提供内置的virtualenv支持以及Python版本切换(如果需要)
  • 与Python 2或3搭配使用时效果很好,可以一次安装多个版本

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

一些不错的教程:

pyenv-virtualenv插件现在内建-类型pyenv commands | grep virtualenv检查。我不会首先使用pyenv-virtualenvwrapper插件-了解如何与pyenv集成程度更高的pyenv-virtualenv进行交流,因为这涵盖了virtualenvwrapper的大部分工作。

pyenv建模rbenv(用于Ruby版本切换的好工具),并且其唯一依赖项是bash。

  • pyenv与非常相似的名称无关pyvenv-它是等效的virtualenv,是最新Python 3版本的一部分,并且不处理Python版本切换

注意事项

关于pyenv的两个警告:

  1. 它只能从bash或类似贝壳的作品-或者更具体地说,pyenv-的virtualenv插件不一样dash,这是/bin/sh在Ubuntu或Debian的。
  2. 它必须从交互式登录外壳程序(例如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

2
  • 您可以执行此操作而无需在python本身中安装任何东西。

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

  • 您无需查找virtualenvtar文件的最新版本

  • 您无需在bash脚本中编辑版本信息即可保持最新状态。

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

  • 这适用于2.7和3.X

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

将来导入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]

例如(如果您确实需要的distribute兼容性层setuptools

python /tmp/initvenv.py venv distribute

请注意,使用较旧的python版本,这可能会给您InsecurePlatformWarnings¹。

获得virtualenv(例如名称venv)后,您可以使用virtualenv刚刚安装的虚拟环境来设置另一个virtualenv :

venv/bin/virtualenv venv2

虚拟环境包装器

我建议在一次设置后也查看一下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和/或中解决它request,但开发人员相互指出是原因。我得到了通常不切实际的建议,将我使用的python版本升级到最新版本。我确信这会中断我的Linux Mint 17安装。幸运的是pip缓存了软件包,因此每次安装软件包时仅发出一次警告。


InsecurePlatformWarning可以通过安装来自PyPI的其他软件包pyopenssl,pyasn1,ndg-httpsclient来修复警告(即,如果Python早于2.7.9版)。(它支持SSL,通过PyOpenSSL解码证书,https。)如果没有正确的协议,它实际上不足以安全下载和运行任何代码。
hynekcer

@hynekcer我会尝试一下。我问自己为什么为什么不将pip和/或request依赖于适当(较旧)python版本的那些软件包。
Anthon 2015年

0

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

基本上我做什么,是安装pipsudo easy_install pip,然后用于sudo pip install virtualenv再创建一个环境:virtualenv my_env(命名为你想要的),下面是我所做的:virtualenv --distribute my_env; 其安装distributepip在我的virtualenv。

再次,按照virtualenv页面上的说明进行操作。

有点麻烦,来自Ruby; P


0

这是安装virtualenvwrapper(this的更新)的一种好方法。

下载virtualenv-1.11.4(可在此处找到最新信息),将其解压缩,打开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...等

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


0

好消息是,如果您已安装python3.4,则已经安装了pyvenv。所以就

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

现在,在此虚拟环境中,您可以使用pip为该项目安装模块。

离开这个虚拟环境,

deactivate
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.