什么是安装pip,virtualenv和为Python分发的正确方法?
简短的问题
- 安装
pip
,virtualenv
和distribute
的正确方法是什么?
背景
在我对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? 。 我喜欢保持一个干净的全球站点包目录的想法,所以我安装的唯一的其他软件包是virtualenvwrapper
和distribute
。 (我最近添加了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这样的更新版本,这可能会破坏操作系统上的其他内容。
回到简短的问题
所以雕文的回答让我回到我原来的问题:
- 安装
pip
,virtualenv
和distribute
的正确方法是什么?
你可以做到这一点,而无需安装任何东西到Python本身。
你不需要sudo或任何特权。
你不需要编辑任何文件。
将virtualenv安装到引导虚拟环境中。 使用该虚拟环境来创build更多。 由于virtualenv附带点和发行,你从一个安装得到的一切。
- 下载virtualenv:
- 解压源码包
- 使用解压后的tarball创build一个干净的虚拟环境。 这个虚拟环境将被用来“引导”他人。 所有的虚拟环境将自动包含点和分发。
- 使用pip,将virtualenv安装到该引导环境中。
- 使用该引导环境来创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-bootstrap
或python3 virtualenv.py path-to-bootstrap
来创build引导环境。
我认为字形意味着做这样的事情:
- 创build一个目录
~/.local
,如果它不存在的话。 - 在
~/.bashrc
,确保~/.local/bin
在PATH
,而~/.local
在PYTHONPATH
。 -
创build一个包含的文件
~/.pydistutils.cfg
[install] prefix=~/.local
这是一个标准的ConfigParser格式的文件。
-
下载
distribute_setup.py
并运行python distribute_setup.py
(没有sudo
)。 如果它抱怨一个不存在的site-packages
目录,请手动创build它:mkdir -p〜/ .local / lib / python2.7 / site-packages /
-
运行
which easy_install
来validation它来自~/.local/bin
- 运行
pip install virtualenv
- 运行
pip install virtualenvwrapper
- 创build一个虚拟的env包含文件夹,说
~/.virtualenvs
-
在
~/.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.
安全思想要点:
- curl做sslvalidation。 wget没有。
- 从pip 1.3.1开始,pip也做sslvalidation。
- 较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
/wget
或tar
,也不需要pip
或easy_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]
例如(如果你确实需要setuptools
的distribute
兼容层)
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安装。 幸运的是pip
caching包,所以每个包安装只发出一次警告。
我有很多问题(见下文),安装升级后的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的两个警告:
- 它只能从bash或类似的shell运行 – 或者更具体地说,pyenv-virtualenv插件不喜欢在Ubuntu或Debian上是
/bin/sh
dash
。 - 它必须从交互式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 env1
, lsvirtualenv
注意:您可以从Downloads文件夹中删除virtualenv-1.11.4
和virtualenv-1.11.4.zip
。
好消息是如果你已经安装了python3.4,pyvenv已经被安装了。 所以,只是
pyvenv project_dir source project_dir/bin/activate python --version python 3.4.*
现在在这个虚拟env中,你可以使用pip为这个项目安装模块。
离开这个虚拟env,只是
deactivate