web-dev-qa-db-ja.com

virtualenvフォルダーを壊さずに名前を変更する

フォルダーを作成し、その中のvirtualenvインスタンスを初期化しました。

$ mkdir myproject
$ cd myproject
$ virtualenv env

(env)$ pip freezeを実行すると、インストールされているパッケージが表示されます。

ここで、myproject/の名前をproject/に変更します。

$ mv myproject/ project/

しかし、今実行すると

$ . env/bin/activate
(env)$ pip freeze

pipがインストールされていないと表示されます。環境を壊さずにプロジェクトフォルダーの名前を変更するにはどうすればよいですか?

156
Riley Watkins

相対パスを使用するには、インストールを調整する必要があります。 virtualenvは、--relocatableオプションでこれを提供します。 ドキュメント から:

通常、環境は特定のパスに関連付けられています。つまり、環境を移動したり、別のコンピューターにコピーしたりすることはできません。次のコマンドを使用して、環境を修正して再配置可能にすることができます。

$ virtualenv --relocatable ENV

注:ENVは仮想環境の名前であり、ENVディレクトリの外部から実行する必要があります。

これにより、setuptoolsまたは配布によって作成されたファイルの一部が相対パスを使用するようになり、Pythonインタープリターの場所を使用して環境を選択する代わりにactivate_this.pyを使用するようにすべてのスクリプトが変更されます。

注:パッケージを環境にインストールした後、これを実行する必要があります。環境を再配置可能にしてから新しいパッケージをインストールする場合、virtualenv --relocatableを再度実行する必要があります。

142
ire_and_curses

「理由を知る」ことは「方法を知る」ことよりも重要。そこで、これを修正する別のアプローチを紹介します。

. env/bin/activateを実行すると、実際には次のコマンドが実行されます(たとえば、/tmpを使用):

VIRTUAL_ENV="/tmp/myproject/env"
export VIRTUAL_ENV

ただし、myprojectの名前をprojectに変更したため、そのコマンドは実行できませんでした。システムグローバル環境にpipをインストールしておらず、virtualenv pipのソースが正しくないため、pip is not installedと表示されるのはこのためです。

これを手動で修正したい場合、これが方法です:

  1. Vimのようなお気に入りのエディターで、通常42行目の/tmp/project/env/bin/activateを変更します。

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. 1行目の/tmp/project/env/bin/pipを変更します。

    #!/tmp/myproject/env/bin/python => #!/tmp/project/env/bin/python

その後、仮想環境envを再度アクティブにすると、pipが再び戻ってきます。

103
holys

注: As @jb。このソリューションは、簡単に(再)作成されたvirtualenvsにのみ適用されることを指摘しています。環境のインストールに数時間かかる場合、このソリューションはお勧めしません


Virtualenvは、作成と切り替えが簡単なので素晴らしいです。単一の構成にロックされるのを防ぎます。プロジェクトの要件がわかっている場合、または取得できる場合は、新しいvirtualenv

  • requirements.txtファイルを作成します

    (env)$ pip freeze > requirements.txt

    • requirements.txtファイルを作成できない場合は、元のenvを削除する前にenv/lib/pythonX.X/site-packagesを確認してください。
  • 既存の(env)を削除します

    deactivate && rm -rf env

  • 新しいvirtualenvを作成してアクティブ化し、要件をインストールします

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


または、virtualenvwrapperを使用して、すべてのvirtualenvが一元化された場所に保持されるため、少し簡単になります

$(old-venv) pip freeze > temp-reqs.txt
$(old-venv) deactivate
$ mkvirtualenv new-venv
$(new-venv) pip install -r temp-reqs.txt
$(new-venv) rmvirtualenv old-venv
36
bnjmn

私は常に手伝うためにvirtualenvwrapperをインストールしています。シェルプロンプトから:

pip install virtualenvwrapper

Virtualenvwrapperドキュメントに文書化された方法があります- cpvirtualenv これはあなたがすることです。環境から出て、シェルプロンプトに戻ることを確認します。必要な名前でこれを入力してください:

cpvirtualenv oldenv newenv

そして、必要に応じて:

rmvirtualenv oldenv

Newenvに移動するには:

workon newenv
28
Afrowave

次の手順に従って問題を修正できます。

  1. ディレクトリの名前を変更します
  2. 再実行:$ virtualenv ..\path\renamed_directory
  3. パッケージをそのままにして、virtualenvはディレクトリの関連付けを修正します
  4. $ scripts/activate
  5. $ pip freezeは、パッケージが適切に配置されていることを確認します
  6. 重要な注意点として、virtualenvディレクトリのスクリプトファイルに静的パスの依存関係がある場合は、それらを手動で変更する必要があります。
16
ryankdwyer

それを行う別の方法は、問題なく何度も私のために働いた virtualenv-clone

pip install virtualenv-clone
virtualenv-clone old-dir/env new-dir/env
11

(プロジェクトフォルダー内)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

無効化と有効化を忘れないでください

4
Ignacio

virtualenv --relocatable ENVは望ましい解決策ではありません。ほとんどの人は、長期的な副作用なしにvirtualenvの名前を変更する機能を求めています。

そのため、私はそれを行う簡単なツールを作成しました。 virtualenv-mv のプロジェクトページでは、もう少し詳しく説明していますが、基本的にmvの単純な実装を使用するのと同じようにvirtualenv-mvを使用できます(なしオプション)。

例:

virtualenv-mv myproject project

ただし、これをハックしただけです。異常な状況(例:シンボリックリンクされたvirtualenv)で破損する可能性があるため、注意して(失うことができないものをバックアップして)問題が発生した場合はお知らせください。

1
Six