[英]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中访问我的本地系统包。
所以我的问题是:
virtualenv
指向其中一个dist-packages
? /usr/lib/python2.6/dist-packages
或/usr/local/lib/python2.6/dist-packages/
/usr/lib/python2.6/site-packages
什么意义? 那里什么都没有! /usr/local/lib/python2.6/dist-packages/
安装了较新版本的XYZ软件包,而在/usr/lib/python2.6/dist-packages
安装了较旧版本的软件包(来自ubuntu repos / apt-get) /usr/lib/python2.6/dist-packages
, import xyz
时import xyz
哪个? 我假设这是基于路径列表,是吗? easy_install
应安装到/usr/local/lib/python2.6/dist-packages
? 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 /?
是
- 它是先到先得的路径吗? 如果我在/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鸡蛋。
- 为什么这么混乱? 这里有什么我想念的吗?
它没有很好的记录。 我通过扫描网络弄明白了。
- 这会影响点子吗?
是的,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.