[英]Why do distribute and pip install to my virtualenv's ./local/bin?
[英]What's the proper way to install pip, virtualenv, and distribute for 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 的博客文章中提取了这些说明So you want to use Python on the Mac? . 我喜欢保持一个干净的全局站点包目录的想法,所以我在那里安装的唯一其他包是virtualenvwrapper
和distribute
。 (因为这个 Python 公共服务公告,我最近在我的工具箱中添加了distribute
。为了安装这两个包,我使用了:
sudo pip install virtualenvwrapper
curl -O http://python-distribute.org/distribute_setup.py
sudo python distribute_setup.py
要真正遵循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,这可能会破坏操作系统上的其他东西。
pip
、 virtualenv
和distribute
的正确方法是什么?你可以在不安装任何东西到 python 本身的情况下做到这一点。
您不需要 sudo 或任何特权。
您不需要编辑任何文件。
将 virtualenv 安装到引导虚拟环境中。 使用那个虚拟环境来创建更多。 由于 virtualenv 附带 pip 和分发版,因此您只需一次安装即可获得所有内容。
这是 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-bootstrap
或python3 virtualenv.py path-to-bootstrap
创建引导环境。
我认为 Glyph 的意思是做这样的事情:
~/.local
,如果它不存在。~/.bashrc
,确保~/.local/bin
在PATH
,而~/.local
在PYTHONPATH
。 创建一个文件~/.pydistutils.cfg
,其中包含
[install] prefix=~/.local
这是一个标准的 ConfigParser 格式文件。
下载distribute_setup.py
并运行python distribute_setup.py
(没有sudo
)。 如果它抱怨一个不存在的site-packages
目录,请手动创建它:
mkdir -p ~/.local/lib/python2.7/site-packages/
运行which easy_install
以验证它来自~/.local/bin
pip install virtualenv
pip install virtualenvwrapper
~/.virtualenvs
在~/.bashrc
添加
export WORKON_HOME source ~/.local/bin/virtualenvwrapper.sh
就是这样,根本不使用sudo
并且您的 Python 环境在~/.local
,与操作系统的 Python 完全分开。 免责声明:不确定virtualenvwrapper
在这种情况下的兼容性如何 - 我无法在我的系统上测试它 :-)
如果您按照我在此答案中链接的几个教程中建议的步骤进行操作,则无需 Walker 和 Vinay 的答案中有些复杂的“手动”步骤即可获得所需的效果。 如果您使用的是 Ubuntu:
sudo apt-get install python-pip python-dev
在 OS X 中通过使用 homebrew 安装 python 来实现等价物(更多细节在这里)。
brew install python
安装pip
,您可以使用它来获取剩余的包(您可以在 OS X 中省略sudo
,因为您使用的是本地 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,您可以在其中自由且无需 sudoless 安装您喜欢的软件包
pip install flask
Python 3.3 添加了venv 模块,Python 3.4 添加了ensurepip 模块。 这使得引导 pip 变得如此简单:
python -m 确保pip
也许在调用venv
之前在虚拟环境中这样做。
PEP 453 中描述了保证点数。
在 Ubuntu 上:
sudo apt-get install python-virtualenv
包python-pip
是一个依赖项,所以它也会被安装。
我制作了这个程序供我们在工作中使用。
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.
安全意识的关键点:
更新:截至 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
如果您确定这是您想要做的,那么执行 sudo python setup.py install 没有问题。
不同之处在于它将使用您操作系统的 site-packages 目录作为要复制的 .py 文件的目标。
因此,如果您希望 pip 可以在整个操作系统范围内访问,那可能就是要走的路。 我不是说其他方式不好,但这可能已经足够公平了。
我在安装升级的 SSL 模块时遇到了各种问题(见下文),甚至在 virtualenv 中,在旧的操作系统提供的 Python 版本之上,所以我现在使用pyenv
。
pyenv使安装新的 Python 版本变得非常容易并支持 virtualenvs。 入门比其他答案中列出的 virtualenv 食谱要容易得多:
brew install pyenv
,在 Linux 上,使用pyenv-installer这可以很好地将“新 Python”版本和 virtualenv 与系统 Python 隔离开来。 因为您可以轻松使用更新的 Python(2.7.9 后),所以 SSL 模块已经升级,当然,就像任何现代 virtualenv 设置一样,您与系统 Python 模块隔离。
几个不错的教程:
pyenv global 3.6.1
(当前用户全局)或pyenv local 2.7.13
(当前目录本地)更容易。 pyenv-virtualenv
插件现已内置 - 输入pyenv commands | grep virtualenv
pyenv commands | grep virtualenv
检查。 我不会使用 pyenv-virtualenvwrapper 插件开始 - 看看你是如何使用 pyenv-virtualenv 的,它更集成到 pyenv 中,因为它涵盖了 virtualenvwrapper 的大部分功能。
pyenv
以rbenv
(一个用于 Ruby 版本切换的好工具)为模型,它唯一的依赖项是 bash。
pyvenv
——它是一个 virtualenv 等价物,是最近 Python 3 版本的一部分,不处理 Python 版本切换关于 pyenv 的两个警告:
dash
,它是 Ubuntu 或 Debian 上的/bin/sh
。bash --login
使用终端)运行,这并不总是容易使用Ansible 等自动化工具实现。因此 pyenv 最适合交互式使用,而不太适合脚本服务器。
使用pyenv
原因pyenv
是,在使用系统提供的较旧 Python 版本时,升级 Python SSL 模块时经常会出现问题。 由于当前的 Linux 发行版支持 Python 3.x,这可能不是什么问题。
安装 ActivePython 。 它包括 pip、virtualenv 和 Distribute。
你可以在不安装任何东西到 python 本身的情况下做到这一点。
您不需要 sudo 或任何特权。
您不需要找到最新版本的virtualenv
tar 文件
您不需要在 bash 脚本中编辑版本信息来保持最新状态。
您不需要安装curl
/ wget
或tar
,也不需要pip
或easy_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]
例如(如果你真的需要setuptools
的distribute
兼容层)
python /tmp/initvenv.py venv distribute
请注意,对于较旧的 Python 版本,这可能会给您带来InsecurePlatformWarning
s¹。
一旦你有了你的 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
缓存包,所以每次安装包时只发出一次警告。
我最近遇到了同样的问题。 我越来越偏向于“始终使用 virtualenv”的心态,所以我的问题是使用 pip 安装 virtualenv,而不安装分发到我的全局或用户站点包目录。 为此,我手动下载了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。
好消息是如果你安装了python3.4,pyvenv已经安装好了。 所以就
pyvenv project_dir
source project_dir/bin/activate
python --version
python 3.4.*
现在在这个虚拟环境中,你可以使用 pip 为这个项目安装模块。
离开这个虚拟环境,只是
deactivate
Virtualenv 官方网站上有很好的说明。 https://pypi.python.org/pypi/virtualenv
基本上我所做的是使用sudo easy_install pip
安装pip
,然后使用sudo pip install virtualenv
然后创建一个环境: virtualenv my_env
(将它命名为你想要的),接下来我做了: virtualenv --distribute my_env
; 它在我的 virtualenv 中安装了distribute
和pip
。
同样,按照virtualenv
页面上的说明进行操作。
有点麻烦,来自 Ruby ;P
下载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 env1
, lsvirtualenv
注意:您可以从下载文件夹中删除virtualenv-1.11.4
和virtualenv-1.11.4.zip
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.