Ubuntu + virtualenv = 一团糟?virtualenv不喜欢dist-packages,而是想要site-packages。

14

请问有人能解释一下在Ubuntu 9.04下Python发生了什么吗?

我正在尝试启动virtualenv,但在ubuntu上使用--no-site-packages标志似乎无效。我使用easy_install安装了virtualenv 1.3.3,并将其升级到了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文件夹,里面什么也没有。从virtualenvpath来看,它似乎是该程序备用使用的文件夹。因此,即使我省略了--no-site-packages,我也不能从任何我的虚拟环境中访问本地系统的包。

所以,我的问题是:

  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(来自ubuntu repos/apt-get)中有旧版本,则当我import xyz时会导入哪个版本?我假设是基于路径列表的,对吗?
  • 为什么这个如此令人困惑?我有什么遗漏的吗?
  • easy_install 应该安装到 /usr/local/lib/python2.6/dist-packages 的定义在哪里?
  • 这会影响pip 吗?
  • 感谢任何能够澄清这一点的人!


    1
    我怀疑Ubuntu出了问题:将site-packages重命名为dist-packages毫无意义或理由(这就是/usr/local的作用)。虚拟环境方面我帮不了你。 - Glenn Maynard
    使用 PYTHONPATH 变量。请参见此处 - hahakubile
    7岁?为什么这个问题还在发布? - Coder Guy
    5个回答

    17

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

    原始邮件内容:

    几年前Debian创建了/usr/local/lib/pythonVERSION/site-packages, 并编译Python二进制文件以将其包含在默认搜索路径中。Ubuntu像往常一样跟随了Debian的脚步。Python开发人员不喜欢这样做,因为使用相同的site-packages目录会与本地安装的/usr/local/bin/python产生干扰。Ubuntu最终决定放弃site-packages并改用dist-packages,这是他们发明的名称,以避免与其他任何东西产生冲突。长篇故事就在那里,如果你在Google上搜索一下,在Python错误跟踪器或distutils SIG等地方就可以找到。

    系统是正常工作的,至少如果你使用Ubuntu虚拟环境包的话。有些人在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

    这样虚拟环境就可以正常工作了,尽管我没有尝试--no-site-packages选项。

    我正在尝试启动虚拟环境,但是--no-site-packages标志在Ubuntu上似乎没有起作用。我使用easy_install安装了virtualenv 1.3.3(我已经将setuptools升级到了0.6c9)

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

    <
    1. 如果我在/usr/local/lib/python2.6/dist-packages/安装了XYZ包的新版本,在/usr/lib/python2.6/dist-packages/ 中安装了旧版本(从ubuntu repos/apt-get获取),当我导入xyz时,哪个版本会被导入? 我假设这是基于路径列表,对吗?

    sys.path按顺序扫描。唯一有趣的是.pth egg文件会放在某些人所期望的路径中更早或更晚。但是,如果您使用 pip 来执行它的所有功能(即除了安装pip本身、预编译的eggs和快照外,还包括本地目录的副本而不是egg链接),那么您不会有很多 .pth eggs。

    1. 为什么这么令人困惑?我是否漏掉了什么?

    这并没有得到很好的记录。我通过浏览网络来找到答案。

    1. 这会影响pip吗?

    是的,pip将自动安装到 /usr/local/lib/pythonVERSION/site-packages。使用 "pip install -E $VIRTUAL_ENV packagename" 安装到虚拟环境中。


    9

    我很想通过将site-packages链接到dist-packages来进行黑客攻击,但我想这可能会影响其他情况,例如您想安装一些扩展而不是从ubuntu dist中安装。对于问题1,除了调整virtualenv的源代码(由于ubuntu和virtualenv都非常流行,我不会惊讶地发现已经存在调整过的版本),我无法想出另一个答案。

    关于问题2,如果您正在使用/usr/local/bin/python,则应该使用/usr/local版本的lib(包括site-packages),反之亦然,如果您正在使用/usr/bin/python,则应该使用/usr/bin版本的lib(包括site-packages)。

    关于问题3,如果您曾经从源代码安装过某个扩展程序(而不是通过easy_install或来自ubuntu发行版),那么其中肯定会有一些东西。

    关于问题4,是的,路径中较早的条目优先。

    关于问题5,easy_install之所以易于使用只是因为其名称 -- 它做了很多黑魔法,尽管它很方便,但由于我们python提交者之间的共识是深度黑魔法只是表面上“容易”,所以它被小心翼翼地排除在标准python库之外。

    关于问题6,我认为这是easy_install的ubuntu修改 -- 如果是这样,那么它将在Canonical或其他ubuntu维护者做出集体决策的地方定义。

    关于问题7,抱歉,我不知道 -- 我手头没有足够新的ubuntu可以检查。


    re1,我希望能够继续使用easy_install/pip进行更新。re2,在我的系统上,没有/usr/local/bin/python,只有/usr/bin/python。看起来easy_install将所有内容安装到/usr/local/lib/python2.x/,而apt-get将所有内容安装到/usr/lib/python2.x/。re6,我已经使用easy_install -U setuptools更新了easy_install。现在应该使用源包而不是Ubuntu的包。希望有9.04版本的用户能够更详细地解释这个问题。 - lostincode

    4
    如果你在使用Ubuntu来开发或部署Python应用程序,除非你正在构建系统管理工具或构建可以被视为新的系统服务的东西,否则你真的不应该触及Ubuntu的Python安装。始终从源代码构建自己的Python,将其打包,并在部署时使用它。这样,你就会拥有所有正确放置的目录,并且virtualenv将正常工作。如果你将在服务器上部署多个Python应用程序,则使Python位于像/home/python/opt/python这样的地方,或者在你的主目录之外的某个地方。确保你对开发人员组(users?)拥有写入权限,以便人们可以轻松添加软件包。
    这也允许你拥有两个层次的软件包。你内部标准工具中的那些可以安装在你的Python发行版中,并成为你部署的tarball的一部分,而只有应用程序特定的软件包才会在virtualenv中。
    不要升级或修改Ubuntu系统安装的Python。

    2

    我有一台Ubuntu 9.04电脑,尝试使用带有site-packages的几个沙盒环境和一个不带的沙盒环境,目前一切正常。

    我的做法与其他人不同的是,我使用了Ubuntu的python-virtualenv软件包(1.3.3),并且认为它已经被Ubuntu团队调整过以适应Ubuntu设置。

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

    实际上,我们在生产中使用类似的设置而没有任何问题。其余问题已经由Alex回答。


    3
    发行版维护者需要停止这样搞事情。我应该能够直接使用像virtualenv这样的知名软件包。 :( - lostincode
    1
    那并没有回答问题。site-packages 不是问题所在,dist-packages 才是。 - dwf

    1

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接