【问题标题】:Migrating to pip+virtualenv from setuptools从 setuptools 迁移到 pip+virtualenv
【发布时间】:2011-06-26 06:06:35
【问题描述】:

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

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

【问题讨论】:

  • AFAIK、pip 和 virtualenv 不能替代 setuptools。 Distribute 是 setuptools 的建议替代品,pip 替代 easy_install,virtualenv 是它自己的特殊东西。前两个允许包维护者描述如何安装包,接下来的两个帮助安装程序跟踪其安装的内容(并安装依赖项),最后一个允许用户轻松地在多个已安装包集合之间切换(例如不同的版本)同一个包)。

标签: python matplotlib packaging virtualenv pip


【解决方案1】:

哇,这真是一大堆问题。他们中的许多人真的应该得到更多细节的自己的 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:错误:'vsprintf' 未在此范围内声明。

它“总是想编译”,因为 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

“-f”链接是获取最新版本所必需的,因为 matplotlib 的 unusual download URLs on PyPI

这两种工具如何与 设置.py? pip 应该替换 easy_install,但不清楚 无论是插入式还是更多 关系复杂。

setup.py 文件是 Python 标准库的包管理“解决方案”distutils 的约定。 distutils 单独缺少一些关键特性,而 setuptools 是一个广泛使用的第三方包,它“包含并扩展”了 distutils 以提供一些附加特性。 setuptools 也使用 setup.pyeasy_install 是与 setuptools 捆绑在一起的安装程序。 Setuptools 的开发停滞了好几年,distribute 是 setuptools 的一个分支,用于修复一些长期存在的错误。最终,通过将distribute 合并回setuptools 解决了分叉问题,并且setuptools 开发现在再次活跃(使用新的维护者)。

distutils2distutils 的大部分重写的新版本,它试图整合来自 setuptools/distribute 的最佳想法,并且应该成为 Python 标准库的一部分。不幸的是,这项努力失败了,所以目前 setuptools 仍然是 Python 打包的事实标准。

Pip 取代了easy_install,但它没有取代setuptools;它需要 setuptools 并在它之上构建。因此它也使用setup.py

virtualenv 是否仅用于开发 模式,或者用户也应该安装 是吗?

对此没有唯一的正确答案;它可以使用任何一种方式。最后,这实际上是您的用户的选择,理想情况下,您的软件应该能够安装在 virtualenv 内部或外部;尽管您可能会选择记录并强调一种方法或另一种方法。这在很大程度上取决于您的用户是谁以及他们可能需要将您的软件安装到什么环境中。

生成的包会是 安装最低 要求(如当前的鸡蛋), 或者它会与源代码一起安装吗? 所有依赖项的二进制文件加上所有 构建工具,创建一个千兆字节 虚拟环境中的怪物?

如果需要编译的包是通过 pip 安装的,则需要从源代码编译。这也适用于任何需要编译的依赖项。

这与你是否使用 virtualenv 的问题无关。 easy_install 默认在 virtualenv 中可用,并且在那里工作得很好。它可以安装预编译的二进制鸡蛋,就像在 virtualenv 之外一样。

用户是否必须修改他们的 $PATH 和 $PYTHONPATH 运行 生成的软件包,如果它安装在 虚拟环境?

为了使用安装在 virtualenv 中的任何东西,您需要使用 virtualenv 的 bin/ 目录中的 python 二进制文件(或安装到 virtualenv 中引用此二进制文件的另一个脚本)。最常见的方法是使用 virtualenv 的 activateactivate.bat 脚本临时修改 shell PATH,因此 virtualenv 的 bin/ 目录是第一个。修改 PYTHONPATH 通常对 virtualenv 没有用处或没有必要。

我是否需要从 virtualenv 的文本字符串,如 过去的日子不好过?

没有。

#egg=Package URL 是什么 句法?这不属于 标准网址,为什么不是 单独的参数?

“#egg=projectname-version”网址片段破解最初是introduced by setuptools and easy_install。由于 easy_install 从 Web 上抓取链接以查找要为给定包名称和版本安装的候选发行版,因此该 hack 允许包作者在 PyPI 上添加 easy_install 可以理解的链接,即使他们没有使用 easy_install 的标准命名约定文件.

@rev 包含在 URL 的什么位置?在 我想结束了,但是 文档对此并不清楚 ("你也可以在 网址”)。

在引用的片段之后的几句话有一个链接可以“阅读the requirements file format以了解其他功能”。 @rev 功能已在此处完整记录和演示。

应该理解的内容 使用现有的需求文件作为 “作为一种新的模板 文件”?这可能意味着任意数量的 东西。

下一句说“它将保持 devel-req.txt 中列出的包的顺序并保留 cmets。”我不确定什么是更简洁的描述。

【讨论】:

  • 非常感谢这样的问题和描述性解决方案:)
【解决方案2】:

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

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

既然你有一个工作的easy_install,安装这两者的最简单方法如下:

easy_install pip
easy_install virtualenv

拥有 virtualenv 后,只需键入 virtualenv yourEnvName,您就会在名为 yourEnvName 的目录中获得新的 python 虚拟环境。

从那里开始,就像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 命令将基于现有文件devel-req.txt 创建一个新文件stable-req.txt。唯一的区别是现有文件中未指定的任何已安装内容都将在新文件中。

【讨论】:

    猜你喜欢
    • 2014-07-25
    • 2013-06-13
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2018-02-28
    • 1970-01-01
    相关资源
    最近更新 更多