繁体   English   中英

Ubuntu + virtualenv =乱七八糟? virtualenv讨厌dist-packages,想要网站包

[英]Ubuntu + virtualenv = a mess? virtualenv hates dist-packages, wants site-packages

有人可以向我解释一下ubuntu 9.04中python的用途吗?

我正在试图启动virtualenv ,而且--no-site-packages标志似乎对ubuntu无效。 我用easy_install安装了virtualenv 1.3.3 (我已升级到setuptools 0.6c9 )并且似乎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也只是空着。 看起来(通过查看virtualenv中的path ),这是virtualenv用作备份的文件夹。 因此,即使我想省略--no-site-packages ,我也无法从我的任何virtualenv中访问我的本地系统包。

所以我的问题是:

  1. 我如何让virtualenv指向其中一个dist-packages
  2. 我应该指出哪些包装? /usr/lib/python2.6/dist-packages/usr/local/lib/python2.6/dist-packages/
  3. /usr/lib/python2.6/site-packages什么意义? 那里什么都没有!
  4. 它是先到先得的路径吗? 如果我在/usr/local/lib/python2.6/dist-packages/安装了较新版本的XYZ软件包,而在/usr/lib/python2.6/dist-packages安装了较旧版本的软件包(来自ubuntu repos / apt-get) /usr/lib/python2.6/dist-packagesimport xyzimport xyz哪个? 我假设这是基于路径列表,是吗?
  5. 为什么这么混乱? 这里有什么我想念的吗?
  6. 在哪里定义easy_install应安装到/usr/local/lib/python2.6/dist-packages
  7. 这会影响pip吗?

感谢任何能够清除这一点的人!

我相信Mike Orr从virtual-env邮件列表中得到的答案似乎是最好的。 注意OP在这两个地方都发布了这个问题。

邮件原始内容:

几年前,Debian创建了/ usr / local / lib / pythonVERSION / site-packages,并编译了Python二进制文件,将其包含在默认搜索路径中。 Ubuntu一如既往地跟随Debian的领先地位。 Python开发人员不喜欢这样,因为你会使用相同的site-packages目录干扰本地安装的/ usr / local / bin / python。 Ubuntu最终决定放弃网站包并使用dist-packages,这是他们发明的一个名字,因此它不会干扰任何东西。 如果你谷歌它,在Python bug跟踪器中的某个地方或者干扰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中。

我很想通过使site-packages成为dist-packages的链接来破解它,但我想这可能会影响你想要安装除ubuntu dist之外的一些扩展的其他情况。 除了调整virtualenv的来源(ubuntu和virtualenv如此受欢迎,我不会惊讶地发现已经存在调整版本),我想不出对1的另一个答案。

Re 2,如果你正在使用/ usr / local / bin / python你应该使用lib的/ usr / local版本(包括site-packages),反之如果你正在使用/ usr / bin / python。

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

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

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

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

Re 7,对不起,不知道 - 我手边没有合理的ubuntu来检查。

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

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

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

不要升级或修改安装了Ubuntu系统的Python。

好吧,我有一个Ubuntu 9.04,并很快尝试设置一个沙盒与站点包,一个没有。 事情很好。

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

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

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

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

必须记住在你需要它的每个virtualenv中这样做,但不依赖于hacks或virtualenv的特殊版本

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM