14

有人可以向我解释一下 ubuntu 9.04 中的 python 发生了什么吗?

我正在尝试启动virtualenv,并且该--no-site-packages标志似乎对 ubuntu 没有任何作用。我安装virtualenv 1.3.3easy_install(我已经升级到了setuptools 0.6c9),一切似乎都安装到了/usr/local/lib/python2.6/dist-packages

假设在使用 apt-get 安装软件包时,它被放置在/usr/lib/python2.6/dist-packages/?

问题是,还有一个/usr/local/lib/python2.6/site-packages空空如也的坐在那里。看起来(通过查看patha virtualenv)这是 virtualenv 用作备份的文件夹。因此,即使我省略了--no-site-packages,我也无法从我的任何 virtualenv 访问我的本地系统包。

所以我的问题是:

  1. 我如何virtualenv指向其中之一dist-packages
  2. 我应该指向哪些dist-packages?/usr/lib/python2.6/dist-packages或者/usr/local/lib/python2.6/dist-packages/
  3. 有什么意义/usr/lib/python2.6/site-packages?里面什么都没有!
  4. 是先到先得吗?如果我安装了更新版本的包 XYZ/usr/local/lib/python2.6/dist-packages/和旧版本(来自 ubuntu repos/apt-get)/usr/lib/python2.6/dist-packages,当我导入哪个包import xyz?我假设这是基于路径列表的,是吗?
  5. 为什么这会如此令人困惑?我在这里缺少什么吗?
  6. easy_install应该安装到哪里定义/usr/local/lib/python2.6/dist-packages
  7. 这也会有影响pip吗?

感谢任何可以解决这个问题的人!

4

5 回答 5

17

我相信虚拟环境邮件列表中的Mike Orr 的回答似乎是最好的。请注意,OP 在这两个地方都发布了这个问题。

邮件原文内容:

多年前,Debian 创建了 /usr/local/lib/pythonVERSION/site-packages,并编译了 Python 二进制文件以将其包含在默认搜索路径中。Ubuntu 像往常一样追随 Debian。Python 开发人员不喜欢这样,因为使用相同的站点包目录会干扰本地安装的 /usr/local/bin/python。Ubuntu 最终决定放弃 site-packages 并改用 dist-packages,这是他们发明的一个名称,因此它不会干扰任何事情。如果你用谷歌搜索它,它就在某个地方,在 Python 错误跟踪器或 distutils SIG 之类的某个地方。

该系统可以正常工作,至少如果您使用 Ubuntu virtualenv 软件包。有些人在 Ubuntu 上使用本地安装的 virtualenv 时遇到问题,因为没有添加魔法 sys.path 条目或其他什么。我不确定 --no-site-packages 因为我从不使用该选项:我从 Ubuntu 包中运行 PIL 和 mysqldb,因为有时很难编译它们的 C 依赖项。(需要正确的头文件,Python 忽略头文件等)

所以 Ubuntu Python 包进入 /usr/lib/pythonVERSION/dist-packages。或者出于某种原因那个 python-support 目录。本地安装的 Python 包默认进入 /usr/local/lib/pythonVERSION/dist-packages。每当我安装 Ubuntu 9.04 系统时,我都会运行:

$ sudo apt-get install python-setuptools (6.0c9) $ sudo apt-get install python-virtualenv (1.3.3) $ sudo easy_install pip $ sudo pip install virtualenvwrapper

virtualenvs 以这种方式工作得很好,虽然我没有尝试过 --no-site-packages。

我正在尝试启动 virtualenv,而 --no-site-packages 标志似乎对 ubuntu 没有任何作用。我用easy_install安装了virtualenv 1.3.3(我已经升级到setuptools 0.6c9)

这些版本都在 Ubuntu 9.04 中,所以通过在本地安装它们会让你自己变得更难。

一切似乎都安装到 /usr/local/lib/python2.6/dist-packages

是的

我假设在使用 apt-get 安装软件包时,它被放置在 /usr/lib/python2.6/dist-packages/ 中?

是的

  1. 是先到先得吗?如果我在 /usr/local/lib/python2.6/dist-packages/ 中安装了更新版本的包 XYZ 并且在 /usr/lib/python2.6/dist 中安装了旧版本(来自 ubuntu repos/apt-get) -packages,当我导入 xyz 时会导入哪个包?我假设这是基于路径列表的,是吗?

sys.path 按顺序扫描。唯一有趣的是 .pth 鸡蛋比某些人预期的更早或更晚被放置在路径中。但是,如果您将 pip 用于它可以做的所有事情(即除了安装 pip 本身、预编译的鸡蛋以及作为副本而不是鸡蛋链接的本地目录的快照),那么您将不会有很多 .pth 鸡蛋反正.

  1. 为什么这会如此令人困惑?我在这里缺少什么吗?

它没有很好的记录。我通过扫描网络弄清楚了。

  1. 这也会影响点子吗?

是的,pip 会自动安装到 /usr/local/lib/pythonVERSION/site-packages。使用“pip install -E $VIRTUAL_ENV packagename”安装到 virtualenv。

于 2009-10-13T03:09:20.230 回答
9

我很想通过将 site-packages 设置为 dist-packages 的链接来破解它,但我想这可能会影响您想要安装一些扩展而不是从 ubuntu dist 安装的其他情况。除了调整 virtualenv 的源代码(ubuntu 和 virtualenv 都如此受欢迎,如果发现调整后的版本已经存在,我不会感到惊讶),我想不出另一个答案。

关于 2,如果您使用的是 /usr/local/bin/python,则应该使用 lib 的 /usr/local 版本(包括站点包),反之,如果您使用的是 /usr/bin/python。

Re 3,如果您从源代码(不是通过 easy_install 或从 ubuntu 的发行版)安装 /usr/bin/python 的扩展,将会有一些东西。

Re 4,是的,路径上的早期条目优先。

Re 5,easy_install 仅在它的名字上很简单——它做了这么多的黑魔法,尽管它很方便,但它被小心地排除在标准 python 库之外,因为我们 python 提交者之间的共识是,为了方便而深黑魔法是“容易的”只在表面上。

关于 6,我认为这是对 easy_install 的 ubuntu 修改——如果这是正确的,那么它是在 Canonical 或其他 ubuntu 维护者做出集体决定的任何地方定义的。

Re 7,对不起,不知道——我手头没有最近的 ubuntu 可供检查。

于 2009-08-01T01:52:29.060 回答
4

你真的不应该接触 Ubuntu 的 Python 安装,除非你正在构建系统管理工具,或者构建一些可以被认为是新系统服务的东西。

如果您使用 Ubuntu 开发或部署 Python 应用程序,请始终从源代码构建您自己的 Python,将其打包并用于部署。这样,您将所有目录都放在正确的位置,并且 virtualenv 将正常工作。如果您将在服务器上部署多个 Python 应用程序,那么请让您的 Python 存在于某个地方,例如您的主目录/home/python/opt/python主目录之外的某个地方。确保您拥有开发人员组 ( users?) 的写入权限,以便人们可以轻松添加包。

这也允许您拥有两层包。作为您内部标准工具的工具可以安装在您的 Python 发行版中,并成为您部署的 tarball 的一部分,并且只有特定于应用程序的包才会在 virtualenv 中。

请勿升级或修改 Ubuntu 系统安装的 Python。

于 2011-08-02T22:51:51.153 回答
2

好吧,我有一个 Ubuntu 9.04,并很快尝试设置几个带有站点包的沙箱,一个没有。一切正常。

我采用的方法的唯一区别是我使用了 Ubuntu 的 python-virtualenv 包(1.3.3)。并假设它由 Ubuntu 团队调整以适应 Ubuntu 设置。

总结一下暂时禁用easy_installed virtualenv,使用打包的python-virtualenv,看看是否符合你的期望。

事实上,我们使用类似的设置进行生产没有任何问题。休息已由亚历克斯回答。

于 2009-08-01T07:50:26.583 回答
1

另一种解决方法:
https ://stackoverflow.com/a/17265840/202168

必须记住在需要它的每个 virtualenv 中执行此操作,但不依赖于 hack 或特殊版本的 virtualenv

于 2013-06-23T22:17:48.273 回答