从setuptools迁移到pip+virtualenv
相比于 setuptools
,pip
和 virtualenv
听起来真是太棒了。能够卸载软件包会很方便。不过我的项目已经在用 setuptools
了,那我该怎么迁移呢?我找到的网站大多都很模糊和笼统。所以在阅读了主要网站并尝试了一些东西后,我有了一些问题:
- 首先,
virtualenv
和pip
现在应该可以正常使用了吗?如果不能,请忽略后面的内容,别当我是在胡言乱语。 - 我该怎么安装
virtualenv
呢?我有点不相信它会像其他地方说的那样复杂。 - 有没有一套经过验证的说明,教我怎么在虚拟环境中安装matplotlib?不知道为什么它总是想在这里编译,而不是直接安装一个包,结果总是失败(即使在执行了
build-dep
后,已经占用了250MB的磁盘空间)。在一堆警告后,它会打印出src/mplutils.cpp:17: error: ‘vsprintf’ was not declared in this scope
。 pip
和setup.py
是怎么互动的?pip
应该是替代easy_install
的,但不太清楚它们的关系是简单的替换还是更复杂。virtualenv
只是用于开发模式,还是用户也应该安装它?- 生成的包会以最小的要求安装(像现在的 egg 一样),还是会安装所有依赖的源代码和二进制文件,加上所有的构建工具,导致虚拟环境变成一个巨大的怪物?
- 如果包是在虚拟环境中安装的,用户需要修改他们的
$PATH
和$PYTHONPATH
才能运行它吗? - 我还需要像以前那样为
virtualenv
创建一个文本字符串脚本吗? - 关于
#egg=Package
的 URL 语法是怎么回事?这不是标准 URL 的一部分,为什么它不是一个单独的参数呢? - @rev 是包含在 URL 的哪里?我想应该是在末尾,但文档对此并不明确(“你也可以在 URL 中包含 @rev”)。
- 使用现有的需求文件作为“新文件的模板”,这到底意味着什么?这可能有很多种解释。
2 个回答
我不能回答你所有的问题,但希望下面的内容能帮到你。
其实,virtualenv
和pip
都很好用,很多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解释器在大多数情况下可以当作真实的解释器来用。它的主要用途是避免把真实解释器的库搞得乱七八糟,尤其是当你有两个库或应用需要不同且不兼容的同一个库的版本时。
如果你或者用户在虚拟环境中安装了某个东西,它在其他虚拟环境或系统的Python解释器中是无法使用的。你需要使用 source /path/to/yourvirtualenv/bin/activate
命令来切换到你安装了库的那个虚拟环境。
他们所说的“作为新文件的模板”是指 pip freeze -r devel-req.txt > stable-req.txt
这个命令会根据现有的 devel-req.txt
文件创建一个新的文件 stable-req.txt
。唯一的区别是,新文件中会包含那些在现有文件中没有指定的安装内容。
哇,这真是一系列复杂的问题。很多问题都值得单独发一个帖子来详细讨论。我会尽量回答:
首先,virtualenv和pip现在应该能正常使用了吗?
是的,虽然它们并不适合所有人的需求。Pip和virtualenv(还有其他Python包管理工具)并不完美,但它们被广泛使用,很多人都依赖它们。
virtualenv应该怎么安装?我不太相信它的安装过程会这么复杂。
你提到的那个答案之所以复杂,是因为它试图不对你的全局Python安装做任何改动,而是把所有东西安装到~/.local
目录下。这有一些好处,但设置起来更复杂。它还安装了virtualenvwrapper,这是一些方便的bash脚本,用来处理virtualenv,但并不是使用virtualenv的必要条件。
如果你在Ubuntu上,运行aptitude install python-setuptools
,然后再运行easy_install virtualenv
,应该能顺利安装virtualenv,而不会对你的全局Python环境造成影响(除非你已经安装了Ubuntu的virtualenv包,但我不推荐这样,因为那可能是个旧版本)。
有没有经过测试的说明,教我怎么在虚拟环境中安装matplotlib?总是想在这里编译,而不是直接安装包,结果总是失败(即使在执行build-dep后,已经占用了250MB的磁盘空间)。在一堆警告后,它打印出src/mplutils.cpp:17: error: ‘vsprintf’ was not declared in this scope。
它“总是想编译”是因为pip的设计是只从源代码安装,而不安装预编译的二进制文件。这是一个有争议的选择,可能也是pip在Python网页开发者中广泛使用的主要原因,因为他们使用的更多是纯Python包,并且通常在POSIX环境中开发和部署,在这些环境中,工作编译链是标准配置。
这样设计的原因是,提供预编译的二进制文件会面临不同平台和构建架构的组合爆炸问题(包括Python版本、UCS-2与UCS-4的Python构建、32位与64位等等)。easy_install在PyPI上找到正确的二进制包的方式在大多数情况下是有效的,但并没有考虑到所有这些因素,可能会出错。因此,pip干脆避免了这个问题(而是要求你有一个可用的编译环境)。
在很多情况下,需要C编译的包发布的速度较慢,直接安装操作系统的包也是可以接受的。不过,这样就无法在不同的虚拟环境中使用不同版本的包了。
我不知道是什么导致了你的编译错误,在我这(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在PyPI上的下载链接比较特殊。
这两个工具是如何与setup.py互动的?pip应该替代easy_install,但不清楚它们的关系是简单的替换还是更复杂。
setup.py
文件是distutils的一个约定,这是Python标准库的包管理“解决方案”。单独的distutils
缺少一些关键功能,而setuptools是一个广泛使用的第三方包,它“拥抱并扩展”了distutils,提供了一些额外的功能。setuptools
也使用setup.py
。easy_install
是与setuptools捆绑在一起的安装工具。setuptools的开发停滞了好几年,而distribute是setuptools的一个分支,用来修复一些长期存在的bug。最终,这个分支与setuptools合并,setuptools的开发现在又恢复了(有了新的维护者)。
distutils2是一个几乎重写的新版本,试图结合setuptools/distribute的最佳想法,并计划成为Python标准库的一部分。不幸的是,这个努力失败了,所以目前setuptools仍然是Python打包的事实标准。
Pip替代了easy_install,但并没有替代setuptools;它依赖于setuptools并在其基础上构建。因此,它也使用setup.py
。
virtualenv只是用于开发模式,还是用户也应该安装它?
这个问题没有单一的正确答案;它可以两种方式使用。最终这真的是用户的选择,你的软件理想情况下应该能够在虚拟环境内外安装;不过你可能会选择记录并强调某种方法。这很大程度上取决于你的用户是谁,以及他们可能需要在什么环境中安装你的软件。
生成的包会以最小的要求安装(像当前的egg),还是会安装所有依赖的源代码和二进制文件,以及所有构建工具,导致虚拟环境中出现一个巨大的包?
如果通过pip安装一个需要编译的包,它将需要从源代码编译。这也适用于任何需要编译的依赖包。
这与是否使用虚拟环境无关。easy_install
在虚拟环境中默认可用,并且在里面工作得很好。它可以安装预编译的二进制egg,就像在虚拟环境外部一样。
如果包安装在虚拟环境中,用户是否需要修改他们的$PATH和$PYTHONPATH才能运行它?
要使用安装在虚拟环境中的任何东西,你需要使用虚拟环境的bin/
目录中的python二进制文件(或其他引用这个二进制文件的脚本)。最常见的做法是使用虚拟环境的activate
或activate.bat
脚本,临时修改shell的PATH
,使虚拟环境的bin/
目录排在最前面。修改PYTHONPATH
在虚拟环境中通常并不有用或必要。
我需要像以前那样从文本字符串创建一个脚本来使用virtualenv吗?
不需要。
#egg=Package的URL语法是怎么回事?这不是标准URL的一部分,为什么不单独作为一个参数?
“#egg=projectname-version”这个URL片段的用法最早是由setuptools和easy_install引入的。因为easy_install从网上抓取链接来查找给定包名和版本的候选分发,这个技巧允许包作者在PyPI上添加easy_install能够理解的链接,即使他们的文件没有使用easy_install的标准命名约定。
@rev在URL中是怎么包含的?我想是在最后,但文档对此不太清楚(“你也可以在URL中包含@rev”)。
在那段引用的内容后面有一句话提到“阅读需求文件格式以了解其他功能。”@rev
的功能在那里面有详细的文档和示例。
使用现有的需求文件作为“新文件的模板”应该理解为什么?这可能意味着很多事情。
下一句说“它会保持devel-req.txt中列出的包的顺序,并保留注释。”我不太确定还有什么更好的简洁描述。