簡體   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