有人可以请解释一下在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
,它只是空的。 看起来(通过查看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/lib/python2.6/dist-packages
安装了XYZ软件包的较新版本,并且在/usr/lib/python2.6/dist-packages
安装了较旧版本的软件包(来自ubuntu repos / apt-get) /usr/lib/python2.6/dist-packages
,当我import xyz
时会导入哪一个? 我假设这是基于path列表,是吗? easy_install
应该安装到/usr/local/lib/python2.6/dist-packages
? pip
吗? 感谢任何人可以清除这个!
我试图通过使站点包与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维护者在其中作出集体决定。
回复7,对不起,不知道 – 我没有合理的近期Ubuntu的手头检查。
我相信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追踪器或distutils SIG或其他地方的某处,那么这个loing的故事就在那里。
系统工作,至少如果你使用Ubuntu的virtualenv包。 有些人在Ubuntu上使用本地安装的virtualenv时遇到了问题,因为没有添加神奇的sys.path条目等等。 我不确定–no-site-packages,因为我从来不使用这个选项:我从Ubuntu包运行PIL和mysqldb,因为有时候编译它们的C依赖关系可能很困难。 (需要正确的头文件,Python是忽略头文件等)
所以Ubuntu的Python包进入/ usr / lib / pythonVERSION / dist-packages。 或者,由于某种原因,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工作正常,虽然我还没有尝试 – 无站点包。
我试图启动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 /?
是
- 是先到先得吗? 如果我在/usr/lib/python2.6/dist-packages/中安装了更新版本的软件包XYZ,并在/ usr / lib / python2.6 / dist中安装了旧版本(来自ubuntu repos / apt-get) -packages,当我导入xyz时会导入哪一个? 我假设这是基于路径列表,是吗?
sys.path按顺序扫描。 唯一有趣的事情是,第.pth蛋比早些时候或晚些时候在一些人的期望。 但是,如果你使用pip来做所有事情(例如,除了安装pip本身,预编译的egg以及本地目录的副本,而不是egg链接),反正你也不会有很多.pth蛋。
- 为什么这到底是如此混乱? 有什么我在这里失踪?
这没有很好的文件。 我通过扫描网络找到了它。
- 这也会影响点子吗?
是的,点将自动安装到/ usr / local / lib / pythonVERSION / site-packages。 使用“pip install -E $ VIRTUAL_ENV包名”安装到virtualenv中。
除非您正在构建系统管理工具,或者构建可以被认为是新系统服务的东西,否则您不应该接触Ubuntu的Python安装。
如果您使用Ubuntu开发或部署Python应用程序,则始终从源代码构建您自己的Python,并将其用于部署。 这样你就可以将所有的目录放在正确的位置,virtualenv将正常工作。 如果您要在服务器上部署多个Python应用程序,请将您的Python存放在/home/python
或/opt/python
或您的主目录之外的某处。 确保您拥有开发人员组( users
?)的写入权限,以便人们可以轻松地添加软件包。
这也可以让你有两层包。 那些是你的内部标准工具的东西可以安装在你的Python发行版中,并且可以作为你部署的tar包的一部分,只有特定于应用程序的软件包才是虚拟的。
不要升级或修改Ubuntu系统安装的Python。
那么我有一个Ubuntu 9.04,并迅速尝试与网站包和一个没有建立一对沙箱。 事情工作正常。
我采取的方法唯一的区别是我使用Ubuntu的python-virtualenv包(1.3.3)。 并假设它是由Ubuntu团队调整,以适应Ubuntu的设置。
总结一下禁用easy_installed virtualenv, 使用打包的python-virtualenv ,看看是否符合你的期望。
事实上,我们使用类似的设置进行生产没有任何问题。 休息已经由Alex回答了。
另一种解决方法是:
https://stackoverflow.com/a/17265840/202168
必须记住在每个你需要的virtualenv中这样做,但不要依靠黑客或特殊版本的virtualenv