2011-08-22 109 views
17

我一直在尋找答案,但沒有找到一個。 我有一個虛擬env目錄,與req.txt項目目錄。 當我運行pip -r req.txt時,它會從github(源代碼)和一些來自pypi的應用程序安裝一些應用程序。 來自pypi的那些在虛擬evn上進行可重定位調用後仍然沒有問題,但是從github安裝的應用程序的站點包中的鏈接仍然指向舊的目錄位置。virtualenv relocatable - 它真的工作

其他人都看到過這種行爲?任何快速解決方法? 另外,可重定位不遵守最初在virtualenv上使用的--no-site-packages標誌。一旦你移動虛擬並重新激活它,一切都可以從系統的站點包中看到。 Docs將此行爲表示爲事實,所以我想知道是否有任何快速解決方法?

+0

什麼是「虛擬env上的可重定位呼叫」? – hughdbrown

+0

請記住接受您的問題的答案。您可以通過點擊最有幫助的旁邊的複選標記來完成此操作。請回過頭去爲你的舊的,回答的問題做。 – agf

+0

我不明白你爲什麼要移動你的virtualenvs。我只是把它們放在'〜/ .virtualenvs'中,我完成了。沒有麻煩,沒有大驚小怪。 – hughdbrown

回答

12

the documentation--relocatable中所述是一個實驗選項,所以您遇到困難並不奇怪。這就是說,你是否記得在安裝新軟件包後重新運行--relocatable?如果你使用-e從github安裝軟件包,這可能是一個問題,因爲它不會安裝到站點包中,而是符號鏈接到它。作爲使用--relocatable的替代方法,您通常可以擦除virtualenv特定的文件並將其重新創建(在平臺之間切換時我已經做了幾次)。

+0

另外,我使用了'--relocatable',並發現它很好。當然,你需要在重新定位之前運行它,以確保沒有錯過任何東西,就像你說的那樣。 – Marcin

10

不,對於''--relocatable'不會更新'virtualenv/bin/activate'腳本。是的,你可以通過像zeekay建議的那樣重新運行虛擬環境設置來解決這個問題,但是仍然無法導入任何放置在'virtualenv/src'中的'pip -e git ...'安裝,因此你將不得不重新運行這些點子手動安裝。

從現在的經驗來看,我不會安裝pip可編輯(-e),如果需要手動克隆存儲庫到'project/src /'而不是'project/virtualenv/src'並且具有以下auto_prep_pythonpath.py腳本在啓動我的項目之前加載(我在我的django.wsgi腳本中引用它)。

作爲一個方面說明,我爲'project/src'中的任何軟件包添加了'tailored',這些軟件包被修改/被黑客入侵,所以我不必擔心向後兼容性問題,並且跟蹤代碼控制下的所有源代碼在線存儲庫可以並且會對你制動。

希望這會有所幫助。

""" 
Prepares python path to include additional project/src/<APP> in PYTHONPATH - This file gets automatically loaded by projects __init__.py 

This script lives in 'project/src/django-project/auto_prep_pythonpath.py', modify 
'SOURCE_ROOT' if you place it somehwere else. 
""" 
import logging 
import os 
import sys 
SOURCE_ROOT = os.path.dirname(os.path.abspath(__file__)).replace('\\','/') # the replacements are when on windows 
SOURCE_ROOT = os.path.join(SOURCE_ROOT, '../').replace('\\','/') 
SOURCE_ROOT = os.path.normpath(SOURCE_ROOT) 

logger = logging.getLogger(__name__) 

logger.info("Adding packages in 'src/*' required by project to PYTHONPATCH.") 
dirlist_arr = os.listdir(SOURCE_ROOT) 
while dirlist_arr: 
    item_path = os.path.join(SOURCE_ROOT, dirlist_arr.pop()).replace('\\','/') # replace dashes is for win based file system 
    if os.path.isdir(item_path): 
     if not item_path in sys.path: 
      sys.path.insert(0, item_path) # we use insert to take precedence over any global paths - minimises import conflict suprises 
     logger.debug("Path '%s' added." % item_path)