哇,这真是一连串的问题。他们中的许多人真的应该得到更多细节的自己的 SO 问题。我将尽我所能:
首先,virtualenv 和 pip 现在应该处于可用状态吗?
是的,尽管它们不能满足每个人的需求。Pip 和 virtualenv(以及 Python 包管理中的所有其他内容)远非完美,但它们仍然被广泛使用和依赖。
virtualenv应该如何安装?我还没有准备好相信它像其他地方解释的那样复杂。
您链接的答案很复杂,因为它试图避免对您的全局 Python 安装进行任何更改,~/.local
而是安装所有内容。这有一些优点,但设置起来更复杂。它还安装了virtualenvwrapper,这是一组用于使用 virtualenv 的便捷 bash 脚本,但对于使用 virtualenv 不是必需的。
如果你在 Ubuntu 上,aptitude install python-setuptools
接下来easy_install virtualenv
应该让你安装一个工作的 virtualenv,而不会对你的全局 python 环境造成任何损害(除非你还安装了 Ubuntu virtualenv 包,我不推荐它,因为它可能是一个旧版本) .
关于如何在虚拟环境中安装 matplotlib 是否有一套经过测试的说明?出于某种原因,它总是想在这里编译它而不是仅仅安装一个包,并且它总是以失败告终(即使在占用 250 MB 磁盘空间的 build-dep 之后)。经过一大堆警告后,它会打印 src/mplutils.cpp:17: error: 'vsprintf' is not declared in this scope。
它“总是想编译”,因为 pip 在设计上只从源代码安装,它不安装预编译的二进制文件。这是一个有争议的选择,并且可能是 pip 在 Python Web 开发人员中得到最广泛采用的主要原因,他们使用更多的纯 Python 包,并且通常在工作编译链是标准的 POSIX 环境中开发和部署。
选择设计的原因是提供预编译的二进制文件在不同平台和构建架构(包括 python 版本、UCS-2 与 UCS-4 python 构建、32 与 64 位......)下存在组合爆炸问题。easy_install 在 PyPI 上找到正确的二进制包的方式大部分时间都有效,但没有考虑所有这些因素并且可能会中断。所以 pip 完全避免了这个问题(用你有一个工作编译环境的要求来代替它)。
在许多情况下,需要 C 编译的软件包也有一个较慢的发布时间表,并且可以简单地为它们安装 OS 软件包。但是,这不允许在不同的 virtualenvs 中使用它们的不同版本。
我不知道是什么导致了您的编译错误,它适用于我(在 Ubuntu 10.10 上)这一系列命令:
virtualenv --no-site-packages tmp
. tmp/bin/activate
pip install numpy
pip install -f http://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.0.1/matplotlib-1.0.1.tar.gz matplotlib
由于 matplotlib在 PyPI 上的下载 URL 异常,“-f”链接是获取最新版本所必需的。
这两个工具如何与 setup.py 交互?pip 应该取代easy_install,但不清楚是drop-in 还是更复杂的关系。
该setup.py
文件是distutils的约定,Python 标准库的包管理“解决方案”。distutils
仅此一项就缺少一些关键功能,而setuptools是一个广泛使用的第三方软件包,它“包含并扩展”了 distutils 以提供一些附加功能。setuptools
也使用setup.py
. easy_install
是与 setuptools 捆绑在一起的安装程序。Setuptools 的开发停滞了好几年,distribute是 setuptools 的一个分支,用于修复一些长期存在的错误。最终,通过将distribute 合并回setuptools 解决了分叉问题,并且setuptools 开发现在再次活跃(使用新的维护者)。
distutils2是一个大部分重写的新版本,distutils
它试图合并来自 setuptools/distribute 的最佳想法,并且应该成为 Python 标准库的一部分。不幸的是,这项努力失败了,所以目前 setuptools 仍然是 Python 打包的事实标准。
pip 代替了easy_install,但不代替setuptools;它需要 setuptools 并在它之上构建。因此它也使用setup.py
.
virtualenv 仅用于开发模式,还是用户也应该安装它?
对此没有唯一的正确答案。它可以使用任何一种方式。最后,这实际上是您的用户的选择,理想情况下,您的软件应该能够安装在 virtualenv 内部或外部;尽管您可能会选择记录并强调一种方法或另一种方法。这在很大程度上取决于您的用户是谁以及他们可能需要将您的软件安装到什么环境中。
生成的软件包会以最低要求安装(如当前的 egg),还是会安装所有依赖项的源代码和二进制文件以及所有构建工具,在虚拟环境中创建一个千兆字节的怪物?
如果需要编译的包是通过 pip 安装的,则需要从源代码编译。这也适用于需要编译的任何依赖项。
这与您是否使用 virtualenv 的问题无关。easy_install
默认情况下在 virtualenv 中可用,并且在那里工作得很好。它可以安装预编译的二进制鸡蛋,就像它在 virtualenv 之外一样。
如果安装在虚拟环境中,用户是否必须修改他们的 $PATH 和 $PYTHONPATH 才能运行生成的包?
为了使用安装在 virtualenv 中的任何东西,您需要使用 virtualenvbin/
目录中的 python 二进制文件(或安装到 virtualenv 中引用此二进制文件的另一个脚本)。最常见的方法是使用 virtualenvactivate
或activate.bat
脚本来临时修改 shell PATH
,因此 virtualenv 的bin/
目录是第一个。对于 virtualenv,修改PYTHONPATH
通常没有用或没有必要。
我是否需要像过去那样为 virtualenv 的文本字符串创建一个脚本?
不。
#egg=Package URL 语法是什么?这不是标准 URL 的一部分,那么为什么它不是一个单独的参数呢?
“#egg=projectname-version” URL 片段黑客首先由 setuptools 和 easy_install 引入。由于 easy_install 从 Web 上抓取链接以查找要为给定包名称和版本安装的候选发行版,因此该 hack 允许包作者在 PyPI 上添加 easy_install 可以理解的链接,即使他们没有使用 easy_install 的标准命名约定文件.
URL 中的@rev 包含在哪里?最后我想,但文档并不清楚这一点(“你也可以在 URL 中包含@rev”)。
在引用的片段之后的几句话,有一个链接可以“阅读需求文件格式以了解其他功能”。该@rev
功能已完整记录并在那里进行了演示。
将现有需求文件用作“作为新文件的一种模板”应该理解什么?这可能意味着很多事情。
下一句说“它将保持 devel-req.txt 中列出的包的顺序并保留注释。” 我不确定什么是更简洁的描述。