2011-08-22 9 views
17

私は答えを探し続けましたが、見つけられませんでした。 私は仮想env dir、req.txtを持つプロジェクトディレクトリを持っています。 pip -r req.txtを実行すると、github(ソース)とpypiのアプリケーションがインストールされます。 pypiからのものは、仮想evn上で再配置可能なコールの後に問題ありませんが、githubからインストールしたアプリケーションのサイトパッケージ内のリンクは、古いディレクトリの場所を指しています。virtualenv relocatable - 実際に動作します

誰でもこの現象が見られましたか?その周りのどのような迅速な方法ですか? また、リロケータブルは、virtualenvで元々使用されていた--no-site-packagesフラグを受け入れていません。仮想を移動して再度アクティブにすると、システムのサイトパッケージからすべてが表示されます。ドキュメントはこの現象を事実として示しているため、この問題を回避する方法があるのだろうかと思います。

+0

"仮想envのリロケータブルコール"とは何ですか? – hughdbrown

+0

あなたの質問に対する回答を受け入れることを覚えておいてください。これは、最も有益なチェックマークの横にあるチェックマークをクリックして行います。戻って、あなたの古い質問にも答えてください。 – agf

+0

なぜあなたはあなたのvirtualenvsを移動したいのか分かりません。私は '〜/ .virtualenvs'でそれらを持っています。マッスルではない。 – hughdbrown

答えて

12

the documentation--relocatableに記載されているように、実験的な選択肢なので、あなたはそれに苦労しています。つまり、新しいパッケージをインストールした後に--relocatableを再実行することを忘れましたか?パッケージをgithubから-eでインストールした場合、それはサイトパッケージにインストールされずにシンボリックリンクされるため、問題になる可能性があります。 --relocatableを使用する代わりに、通常はvirtualenv固有のファイルを消去し、その場所で再作成することができます(これはプラットフォーム間で切り替えるときに数回かかっています)。

+0

また、 '--relocatable'を使ってみて、うまくいきました。もちろん、あなたが言うように、何も見落とされていないことを確認するために、移転する前にそれを実行する必要があります。 – Marcin

10

いいえ、 '--relocatable'は 'virtualenv/bin/activate'スクリプトを更新しません。はい、それはzeekayが提案したようにvirtual env setupを再実行することで修正できますが、stillsは 'virtualenv/src'に配置されている 'pip -e git ...'インストールをインポートできないため、再実行する必要がありますこれらのピップは手動でインストールされます。

経験から、私はpip editable(-e)でインストールしないで、必要に応じて 'project/virtualenv/src'とは対照的に手動でリポジトリを 'project/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) 
関連する問題