13

所以pipvirtualenv美妙的声音相比setuptools。能够卸载就太好了。但是我的项目已经在使用setuptools,那我该如何迁移呢?到目前为止,我能够找到的网站非常模糊和笼统。因此,在阅读了主要网站并尝试了一些东西之后,这里有一个问题集:

  • 首先,现在是否virtualenv并且pip应该处于可用状态?如果没有,请忽略其余的疯子的胡言乱语。
  • 应该怎么virtualenv安装?我还没准备好相信它像其他地方解释的那样复杂。
  • 关于如何在虚拟环境中安装matplotlib是否有一套经过测试的说明?出于某种原因,它总是想在这里编译它而不是仅仅安装一个包,而且它总是以失败告终(即使之后build-dep占用了 250 MB 的磁盘空间)。在一大堆警告之后,它会打印出来src/mplutils.cpp:17: error: ‘vsprintf’ was not declared in this scope
  • 这两种工具如何交互setup.pypip应该替换easy_install,但不清楚是插入还是更复杂的关系。
  • virtualenv 仅用于开发模式,还是用户也应该安装它?
  • 生成的软件包会以最低要求安装(如当前的 egg),还是会安装所有依赖项的源代码和二进制文件以及所有构建工具,在虚拟环境中创建一个千兆字节的怪物?
  • 如果安装在虚拟环境中,用户是否必须修改他们的$PATH并运行生成的包?$PYTHONPATH
  • 我是否需要从一个文本字符串创建一个脚本virtualenv就像在糟糕的过去一样?
  • #egg=PackageURL 语法是什么?这不是标准 URL 的一部分,那么为什么它不是一个单独的参数呢?
  • URL 中的@rev 包含在哪里?最后我想,但文档并不清楚这一点(“你也可以在 URL 中包含@rev”)。
  • 将现有需求文件用作“作为新文件的一种模板”应该理解什么?这可能意味着很多事情。
4

2 回答 2

22

哇,这真是一连串的问题。他们中的许多人真的应该得到更多细节的自己的 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 中引用此二进制文件的另一个脚本)。最常见的方法是使用 virtualenvactivateactivate.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 中列出的包的顺序并保留注释。” 我不确定什么是更简洁的描述。

于 2011-03-03T19:52:37.393 回答
4

我无法回答您的所有问题,但希望以下内容对您有所帮助。

两者virtualenvpip非常有用。许多 Python 开发人员每天都在使用这些。

由于您有一个工作的easy_install,安装两者的最简单方法如下:

easy_install pip
easy_install virtualenv

一旦你有了 virtualenv,只需输入virtualenv yourEnvName,你就会在一个名为yourEnvName.

从那里开始,它就很简单source yourEnvName/bin/activate了,虚拟 python 解释器将成为您的活动对象。我对matplotlib一无所知,但是除非存在奇怪的硬编码路径问题,否则按照安装交互应该可以正常工作。

如果您可以通过安装某些东西,easy_install通常可以通过pip. 我还没有找到任何easy_install可以做到的事情pip

我不会指望用户能够安装virtualenv(这取决于您的用户是谁)。从技术上讲,在大多数情况下,虚拟 Python 解释器可以被视为真正的解释器。它的主要用途不是弄乱真正的解释器的站点包,并且如果您有两个库/应用程序需要同一库的不同且不兼容的版本。

如果您或用户在 virtualenv 中安装了某些东西,它在其他 virtualenvs 或系统 Python 解释器中将不可用。您需要使用source /path/to/yourvirtualenv/bin/activate命令切换到安装库的虚拟环境。

他们所说的“作为新文件的一种模板”的意思是该命令将基于现有文件pip freeze -r devel-req.txt > stable-req.txt创建一个新文件。唯一的区别是现有文件中尚未指定的任何安装都将在新文件中。stable-req.txtdevel-req.txt

于 2011-02-13T02:06:10.237 回答