What's the proper way to install pip, virtualenv, and distribute for Python?
- 安装
pip 、virtualenv 和distribute 的正确方法是什么?
背景
在回答第4314376号问题时,我建议您使用
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喜欢保持一个干净的全局站点包目录,所以我安装的其他包只有
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 namedez_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的回答让我想到了我最初的问题:
- 安装
pip 、virtualenv 和distribute 的正确方法是什么?
您可以在不向Python本身安装任何东西的情况下完成此操作。
你不需要sudo或任何特权。
您不需要编辑任何文件。
将virtualenv安装到引导虚拟环境中。使用该虚拟环境创建更多。因为virtualenv附带了pip和distribute,所以您可以从一次安装中获得一切。
- http://pypi.python.org/pypi/virtualenv
- https://pypi.python.org/packages/source/v/virtualenv/virtualenv-12.0.7.tar.gz(或最新版本!)
下面是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版本。旧版本需要标志
我认为glyph的意思是这样做:
创建一个文件
1 2 | [install] prefix=~/.local |
这是一个标准的configparser格式文件。
下载
mkdir-p~/.local/lib/python2.7/site-packages/
运行
在
1 2 | export WORKON_HOME source ~/.local/bin/virtualenvwrapper.sh |
就是这样,根本不使用
如果您按照我在这个答案中链接的几个教程中建议的步骤操作,那么在沃克和维尼的回答中,不需要一些复杂的"手动"步骤就可以达到预期的效果。如果你在Ubuntu上:
1 | sudo apt-get install python-pip python-dev |
在OSX中,通过使用自制安装python(此处提供更多详细信息)实现了等效功能。
1 | brew install python |
安装了
1 | sudo pip install virtualenvwrapper |
(这些是您在全球需要安装的唯一软件包,我怀疑它会与操作系统的任何系统级别冲突。如果你想超级安全,你可以保留发行版的版本
注意:在Ubuntu 14.04中,我收到了一些关于pip安装的错误,因此我使用
然后附加到您的
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
可能在调用
保证PIP见PEP 453。
关于Ubuntu:
包
更新:截至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. |
安全意识的要点:
安装ActivePython。它包括pip、virtualenv和distribute。
如果您确定要安装sudo python setup.py,那么安装它没有问题。
不同之处在于,它将使用操作系统的site packages目录作为要复制的.py文件的目标。
因此,如果您希望PIP在操作系统范围内是可访问的,那么这可能是一个可行的方法。我不是说别人的方式不好,但这可能是足够公平的。
我在安装升级的ssl模块时遇到了各种各样的问题(见下文),甚至是在virtualenv中,在旧的操作系统提供的python版本之上,所以我现在使用
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与非常相似的名称
pyvenv 无关,它是一个virtualenv等价物,是最新的python3版本的一部分,不处理python版本切换。
告诫
关于pyenv的两个警告:
因此,pyenv最适合交互式使用,而不适合脚本服务器。
SSL模块问题使用
- Ubuntu14.04包括python2.7.6,它需要相当大的努力将其升级到正确的SSL模块,以便将sni(服务器名称指示)作为客户端进行处理。(我为此写了一些可解释的剧本,这很痛苦,在某些情况下还是破的。)
- 升级的ssl模块将更为重要,因为python.org网站仅在2017年和2018年迁移到tls 1.2。
您可以在不向Python本身安装任何东西的情况下完成此操作。
你不需要sudo或任何特权。
你不需要找到最新版本的
virtualenv tar文件您不需要在bash脚本中编辑版本信息来保持最新。
您不需要安装
curl /wget 或tar ,也不需要安装pip 或easy_install 。这适用于2.7和3.x
将以下内容保存到
从未来导入打印功能
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] |
例如(如果您确实需要
1 | python /tmp/initvenv.py venv distribute |
请注意,对于旧的python版本,这可能会给您提供
一旦您有了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我没有找到抑制警告的方法。它可以在
我最近遇到了同样的问题。我越来越偏爱"总是使用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(您可以在这里找到最新信息),解压它,打开
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 |
就是这样,现在您可以使用
注意:您可以从下载文件夹中删除
virtualenv官方网站上有很好的说明。https://pypi.python.org/pypi/virtualenv
基本上,我做的是用
同样,请遵循
有点麻烦,来自Ruby;p