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

时间:2009-08-01 01:45:23

标签: python ubuntu setuptools virtualenv

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

我正在尝试启动virtualenv,而--no-site-packages标志似乎对ubuntu无效。我使用virtualenv 1.3.3安装了easy_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,只是坐在那里是空的。看起来(通过查看path中的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. 它是先到先得的路径吗?如果我在/usr/local/lib/python2.6/dist-packages/中安装了较新版本的XYZ软件包,而/usr/lib/python2.6/dist-packages中安装了较旧版本的软件包XYZ(来自ubuntu repos / apt-get),那么在我import xyz时会导入哪一个?我假设这是基于路径列表的,是吗?
  5. 为什么这么混乱?我在这里缺少什么吗?
  6. easy_install安装到/usr/local/lib/python2.6/dist-packages
  7. 的定义在哪里
  8. 这会影响pip吗?
  9. 感谢任何能够解决此问题的人!

5 个答案:

答案 0 :(得分:16)

我相信Mike Orr在the virtual-env mailing list的回答似乎是最好的。注意OP在这两个地方都发布了这个问题。

邮件的原始内容:

多年前Debian创建了/ usr / local / lib / pythonVERSION / site-packages, 并编译Python二进制文件以将其包含在默认搜索中 路径。 Ubuntu一如既往地跟随Debian的领先地位。 Python 开发人员不喜欢这样,因为你会受到干扰 本地安装的/ usr / local / bin / python使用相同的站点包 目录。 Ubuntu最终决定放弃网站包并使用 反而包装,他们发明的名称,所以它不会 干扰任何事情。如果有的话,那里的故事就在那里 你谷歌它,在Python的bug跟踪器或distutils SIG或 这样

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

所以Ubuntu Python包进入 / usr / lib目录/ pythonVERSION / DIST-包。或者那个python支持 目录由于某种原因。本地安装的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无关。我安装了virtualenv 1.3.3   easy_install(我已升级到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-中的XYZ包版本   / usr / lib /中的包/和旧版(来自ubuntu repos / apt-get)   python2.6 / dist-packages,当我导入xyz时导入哪一个?   我假设这是基于路径列表的,是吗?
  2.   

按顺序扫描sys.path。唯一有趣的是.pth鸡蛋 比某些人期望的更早或更晚。但如果 你正在使用pip来做它能做的一切(即除了安装pip之外) 本身,预编译的鸡蛋,以及本地目录的快照 复制而不是鸡蛋链接),无论如何你都不会有很多.pth蛋。

  
      
  1. 为什么这么混乱?我有什么东西吗?   在这里失踪?
  2.   

没有详细记录。我通过扫描网络来解决这个问题。

  
      
  1. 这会影响点子吗?
  2.   

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

答案 1 :(得分:9)

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

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

Re 3,如果你从源代码安装了/ usr / bin / python的扩展名(不是通过easy_install或者来自ubuntu的发行版),那里会有一些东西。

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

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

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

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

答案 2 :(得分:4)

除非您正在构建系统管理工具或构建可被视为新系统服务的东西,否则您不应该触及Ubuntu的Python安装。

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

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

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

答案 3 :(得分:2)

好吧,我有一个Ubuntu 9.04,很快就尝试设置一个带有站点包的沙箱和一个没有的沙箱。事情进展顺利。

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

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

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

答案 4 :(得分:1)

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

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