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

短的问题

背景

我的答案所以问题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

字形的责备

我的答案所以问题4314376的注释中,SO用户字形声明:

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

回到那个简短的问题

所以字形的反应引导我回到我最初的问题:

156862 次浏览

我认为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/

    . zip
  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
    

That's it, no use of sudo at all and your Python environment is in ~/.local, completely separate from the OS's Python. Disclaimer: Not sure how compatible virtualenvwrapper is in this scenario - I couldn't test it on my system :-)

如果你确定这是你想要做的,那么安装sudo python setup.py是没有问题的。

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

所以,如果你想让PIP在整个操作系统范围内都可以访问,这可能是可行的方法。我并不是说其他方式不好,但这可能是足够公平的。

你可以在不将任何东西安装到python本身的情况下做到这一点。

你不需要sudo或任何特权。

你不需要编辑任何文件。

将virtualenv安装到引导虚拟环境中。使用虚拟环境来创造更多。由于virtualenv随pip和分发版一起发布,您可以通过一次安装获得所有内容。

    <李>下载virtualenv:

下面是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)。现在你可以用python virtualenv.py path-to-bootstrappython3 virtualenv.py path-to-bootstrap创建你的引导环境

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

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

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

sudo apt-get install python-pip python-dev

在OS X中,通过使用自制程序安装python(更多详细信息在这里)可以实现相同的功能。

brew install python

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

sudo pip install virtualenvwrapper

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

我收到了一些错误与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

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

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. 可以上传pypi tarball的用户比上传github tarball的用户少。

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

在Ubuntu上:

sudo apt-get install python-virtualenv

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

截至2013年7月,该项目不再维护。作者建议使用pyenv。(pyenv没有内置对virtualenv的支持,但使用起来不错。)

Pythonbrew是python的版本管理器,并支持virtualenv。

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

# Initializes the virtualenv
pythonbrew venv init


# Create a virtual/sandboxed environment
pythonbrew venv create mycoolbundle


# Use it
pythonbrew venv use mycoolbundle

Python 3.4开始

Python 3.3添加了venv模块, Python 3.4添加了ensurepip模块。这使得bootstrapping像下面这样简单:

Python -m ensurepip

可能在虚拟环境中调用venv来执行此操作。

保证pip在PEP 453中描述。

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

下载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.4virtualenv-1.11.4.zip

  • 你不需要在python中安装任何东西就可以做到这一点。

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

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

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

  • 你不需要安装curl/wgettar,也不需要安装pipeasy_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]

例:(如果你真的需要setuptoolsdistribute兼容层)

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和/或request中解决,但开发人员将彼此视为原因。我得到了一个通常不现实的建议,把我正在使用的python版本升级到最新版本。我相信这将打破例如我的Linux Mint 17安装。幸运的是pip缓存包,所以发出警告

. sh

. sh

. sh

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

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

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

离开这个虚拟的环境

deactivate

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

pyenv使得安装新的Python版本非常容易,并支持virtualenvs。开始使用比在其他答案中列出的virtualenv食谱更容易:

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

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

一些不错的教程:

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

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

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

警告

关于pyenv的两个警告:

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

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

旧的发行版—SSL模块问题

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