从setuptools迁移到pip + virtualenv

l0b*_*0b0 13 python packaging pip matplotlib virtualenv

所以pipvirtualenv声音相比更精彩setuptools.能够卸载会很棒.但我的项目已经在使用setuptools,那么我该如何迁移?到目前为止,我能够找到的网站非常模糊和笼统.所以这是在阅读主要网站并尝试填写之后的问题选集:

  • 首先,是virtualenvpip应该由现在处于可用状态?如果没有,请将其他人视为狂人的狂言.
  • 应该如何virtualenv安装?我还没有准备好相信它像其他地方解释的一样令人费解.
  • 是否有一组关于如何在虚拟环境中安装matplotlib的测试说明?由于某种原因,它总是想在这里编译它而不是仅仅安装一个包,它总是以失败告终(即使之后build-dep占用了250 MB的磁盘空间).在打印了一大堆警告之后src/mplutils.cpp:17: error: ‘vsprintf’ was not declared in this scope.
  • 两种工具如何互动setup.pypip应该取代easy_install,但目前尚不清楚它是否是一种堕落或更复杂的关系.
  • virtualenv仅用于开发模式,还是用户也应该安装它?
  • 生成的软件包是否会以最低要求(如当前鸡蛋)安装,或者是否会安装所有依赖项的源和二进制文件以及所有构建工具,在虚拟环境中创建一个千兆字节的怪物?
  • 如果用户安装在虚拟环境中,用户是否必须修改它们$PATH$PYTHONPATH运行生成的包?
  • 我是否需要创建一个文本字符串脚本用于virtualenv在坏日子是怎样的?
  • 什么是与#egg=PackageURL语法?这不是标准URL的一部分,为什么它不是一个单独的参数?
  • @rev包含在URL中的哪个位置?最后我想,但文档并不清楚("你也可以在URL中包含@rev").
  • 通过将现有需求文件用作"作为新文件的一种模板",应该理解什么?这可能意味着任何事情.

Car*_*yer 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的测试说明?由于某种原因,它总是想在这里编译它而不是仅仅安装一个包,它总是以失败告终(即使在build-dep占用了250 MB的磁盘空间之后).在发出一大堆警告后,它会输出src/mplutils.cpp:17:错误:'vsprintf'未在此范围内声明.

它"总是想编译",因为pip,设计,只安装源,它不安装预编译的二进制文件.这是一个有争议的选择,可能是pip在Python Web开发人员中得到最广泛采用的主要原因,他们使用更多的纯Python包,并且通常在POSIX环境中开发和部署,其中工作编译链是标准的.

设计选择的原因是提供预编译的二进制文件具有不同平台和构建体系结构的组合爆炸问题(包括python版本,UCS-2与UCS-4 python构建,32对64位......).easy_install在PyPI上找到正确的二进制包的方式大部分时间都有效,但不考虑所有这些因素并且可能会中断.所以pip只是完全避免了这个问题(取而代之的是你有一个工作的编译环境).

在许多情况下,需要C编译的软件包也有一个移动速度较慢的发布计划,而只是为它们安装操作系统软件包是可以接受的.但是,这不允许在不同的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
Run Code Online (Sandbox Code Playgroud)

由于matplotlib 在PyPI上不寻常的下载URL,因此需要"-f"链接来获取最新版本.

这两个工具如何与setup.py交互?pip应该取代easy_install,但目前尚不清楚它是否是一种插入或更复杂的关系.

setup.py文件是distutils的惯例,是Python标准库的包管理"解决方案".distutils单独缺少一些关键功能,而setuptools是一个广泛使用的第三方软件包,"包含和扩展"distutils以提供一些额外的功能.setuptools也用setup.py.easy_install是与setuptools捆绑在一起的安装程序.Setuptools开发已经停滞了好几年,而分发是一个安装工具的分支来修复一些长期存在的错误.最终,fork通过合并分发回setuptools来解决,而setuptools开发现在再次处于活动状态(使用新的维护者).

distutils2是一个大部分重写的新版本,distutils它尝试整合来自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语法是什么?这不是标准URL的一部分,为什么它不是一个单独的参数?

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

@rev包含在URL中的哪个位置?最后我想,但文档并不清楚("你也可以在URL中包含@rev").

在引用片段之后的几个句子中有一个链接"阅读要求文件格式以了解其他功能".该@rev功能已完整记录并在那里进行了演示.

通过将现有需求文件用作"作为新文件的一种模板",应该理解什么?这可能意味着任何事情.

接下来的句子说"它将保留devel-req.txt中列出的包,并保留注释." 我不确定什么是更简洁的描述.