短的问题

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

背景

在我对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 ?我喜欢保持一个干净的全局site-packages目录的想法,所以我在那里安装的其他包只有virtualenvwrapper和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问题4314376的回答的评论中,SO用户Glyph表示:

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

回到那个简短的问题

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

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


当前回答

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

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

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

离开这个虚拟的环境

deactivate

其他回答

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

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

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

你不需要sudo或任何特权。

你不需要编辑任何文件。

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

Download virtualenv: http://pypi.python.org/pypi/virtualenv https://pypi.python.org/packages/source/v/virtualenv/virtualenv-12.0.7.tar.gz (or whatever is the latest version!) Unpack the source tarball Use the unpacked tarball to create a clean virtual environment. This virtual environment will be used to "bootstrap" others. All of your virtual environments will automatically contain pip and distribute. Using pip, install virtualenv into that bootstrap environment. Use that bootstrap environment to create more!

下面是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

发疯!

Note

这里假设您使用的不是旧版本的virtualenv。 旧版本需要标记——no-site- packages(取决于Python版本,——distribute)。现在你可以用python virtualenv.py path-to bootstrap或python3 virtualenv.py path-to bootstrap创建你的引导环境。

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

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

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

离开这个虚拟的环境

deactivate

你不需要在python中安装任何东西就可以做到这一点。 你不需要sudo或任何特权。 您不需要找到virtualenv tar文件的最新版本 您不需要在bash脚本中编辑版本信息以保持更新。 您不需要安装curl/wget或tar,也不需要安装pip或easy_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]

例如(如果你真的需要setuptools的分发兼容层)

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

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

Create a directory ~/.local, if it doesn't already exist. In your ~/.bashrc, ensure that ~/.local/bin is on PATH and that ~/.local is on PYTHONPATH. Create a file ~/.pydistutils.cfg which contains [install] prefix=~/.local It's a standard ConfigParser-format file. Download distribute_setup.py and run python distribute_setup.py (no sudo). If it complains about a non-existing site-packages directory, create it manually: mkdir -p ~/.local/lib/python2.7/site-packages/ Run which easy_install to verify that it's coming from ~/.local/bin Run pip install virtualenv Run pip install virtualenvwrapper Create a virtual env containing folder, say ~/.virtualenvs In ~/.bashrc add export WORKON_HOME source ~/.local/bin/virtualenvwrapper.sh

就是这样,根本不用sudo,你的Python环境在~/中。本地,完全独立于操作系统的Python。免责声明:不确定在这种情况下virtualenvwrapper的兼容性如何-我无法在我的系统上测试它:-)