それを壊すことなくvirtualenvフォルダの名前を変更する


162

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

$ mkdir myproject
$ cd myproject
$ virtualenv env

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

次に、に名前を変更myproject/project/ます。

$ mv myproject/ project/

しかし、今走ると

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

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


1
この質問は古く、すでに回答がありますが、なぜOPがvirtualenvを元の場所に戻すことができないのでしょうか。明らかにそれは移動/名前変更の欲求を解決しませんが、それは作業中のvirtualenvを復元しませんか、それともすでに絶望的に壊れていますか?
Malik

2
はい、そうです、それは仮想環境を修復しますが、問題を解決しません。
フロリアン

2019年11月、Python3。私にとっての最善の解決策は、aarongorka.com / blog / portable
Samir Sadek

回答:


148

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

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

$ virtualenv-再配置可能なENV

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

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

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


2
注意:envをrelocatableに変更すると、単にフォルダーを移動できるだけではありません。(注を参照ドキュメントからコピー)...副作用がある可能性があります。
ベンロバーツ

7
--relocatableオプションには現在いくつかの問題があり、すべての状況で機能するとは限りません。このオプションは、virtualenvの将来のバージョンで廃止される可能性があります。また、これによってパッケージがクロスプラットフォームになるわけではありません。ディレクトリは移動できますが、他の同様のコンピューターでのみ使用できます。
Demz 2013

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venvは、古いvenvを使用するシャバンを見つけるのに役立ちますが、再配置されたvenvの完全な検証ではありません。
ホブ2013年

2
また、.projectvirtualenvwrapperを使用しており、プロジェクトのディレクトリの名前も新しいvirtualenvと一致するように変更している場合は、virtualenvに依存するソースコードへのパスを含むvirtualenvwrapper ファイルを編集する必要があります。
ホブ2013年

これを実行する前に、virtualenvを非アクティブ化する必要がありました。
antonagestam 2013年

108

「理由を知る」ことは、「方法を知る」ことよりも重要だと私は信じています。それで、これを修正する別のアプローチがあります。

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

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

ただし、名前myprojectprojectに変更したため、そのコマンドの実行に失敗しました。これは、システムのグローバル環境にpip is not installedインストールさpipれておらず、virtualenv pipが正しく供給されていないためです。

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

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

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

  2. /tmp/project/env/bin/pip1行目で変更します。

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

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


6
パスを手動で変更する必要がある場合は、ハードコーディングされたファイルが3つ以上あることに注意してください。それらをすべて次のようなもので見つけますgrep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name。実際、Djangoインスタンスの1つで、多くのパッケージに「Python sh-bangへのパス」が含まれていることに気付きました。
ケビン

これは私に大いに役立ちました。私はなぜかを知る必要がありました...ありがとう!
ジャービス

上記のKevenのコメントとは対照的に、これらの2行を編集すると、移動に関するすべての問題が解決されることがわかりましたvirtualenv。おそらく、私が使用していないユースケースがあり、問題が発生しない場合があります。
Deleet、2016年

スクラッチ!今日、私は問題に遭遇しました:ipythonが内で機能しませんvirtualenv。それを解決するために、私はipythonファイルのbashヘッダー(それは何と呼ばれていますか?)を編集しましたが、それはうまくいきました。
Deleet、2016年

うーん、これは私にとっては機能していません。私のアクティブ化スクリプトには、ステップ2で参照されている行1がないようです。何か変更はありましたか?
エヴァンザミール2018年

40

注: @jbとして。が指摘するように、このソリューションは簡単に(再)作成されたにのみ適用されますvirtualenv。環境に数時間かかる場合、このソリューションは推奨されません


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

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

    (env)$ pip freeze > requirements.txt

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

6
一部の人にとってpip install -r requirements.txtは数時間かかります(ラズベリーpiでサードパーティのC拡張をコンパイル)。
jb。

4
おそらく本当かもしれませんが、それは私には縁起の悪いケースのようです。私はまだこれが多くの場合に実行可能な解決策かもしれないと思います。
bnjmn 2013

ええ、多くのプロジェクト(Django Webサイトなど)は、数十の依存関係があっても、すべてをインストールするのに30秒しかかかりません(最初にすべてをダウンロードして '--no-index --find-links = downloadDir'を使用する場合) )
Jonathan Hartley 14

1
@bnjmnワンライナーvirtualenv env && pip install -r requirements.txtは、アクティブ化しないため、新しい環境に要件をインストールしません
Yarin

1
@Yarinそれを指摘してくれてありがとう。私はそれを完全に見逃し、virtualenv-wrapper自分自身を使用していました(作成時に自動的にアクティブになります)。virtualenv混乱を避けるために、をアクティブ化するように回答を更新しました。
bnjmn 2014

28

私はいつも助けるためにvirtualenvwrapperをインストールします。シェルプロンプトから:

pip install virtualenvwrapper

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

cpvirtualenv oldenv newenv

そして、必要に応じて:

rmvirtualenv oldenv

newenvに移動するには:

workon newenv

1
Afrowaveの答えは、実際に受け入れられる方法でなければなりません。
Jaxian

これはvirtualenvwrapper、だけでなく、を使用している場合にのみ機能しvirtualenvます。@ryankdwyerからのこの回答の方が優れています。
LS

私は「virtualenvwrapper」をインストールする必要があることを反映するように私の回答を編集しました。仮想環境の名前変更が頻繁に行われると想定すると、この方法をお勧めします。
Afrowave 2016

virtualenvwrapperに依存していますが、最も単純なものです。そして、それはうまくいきます。
blasrodri 2017

17

次の手順で問題を解決できます。

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

1
これは私にとって非常に良い解決策でした。この解決策はに関連する問題の一部を回避する可能性があるため--relocatable、この解決策は受け入れられた回答よりも優れていると思います。これまでのところ、多くの.pycファイルが_new_name_/lib/python2.7まだを参照していることに気付きました_old_name_。しかし、それは私の環境の動作に影響を与えていないようです。多分唯一のより良い解決策はvirtualenvwrapper、ここでの回答の中で言及されている他のユーティリティのいくつかを使用することです。少なくともこのソリューションでは、追加のプログラムをインストールする必要はありません。
LS

魅力的な作品!
AmirHossein 2017

13

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

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

これはベストアンサーとしてマークする必要があります。手を下げて!クローンを作成するのに少し時間がかかりましたので、忍耐力のある人が必要です。
Amitrajit Bose、

virtualenv-cloneはプロンプトの更新を無視します。手動で行う必要がありました。それ以外は素晴らしいです。
user3667349

5

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

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

非アクティブ化とアクティブ化を忘れないでください


うまく機能します。またはLinuxパスの場合:sed -i "s|$old_dir|$new_dir|g" bin/*
Destroyica

sed -i '.original' 's/old_dir_name/new_dir_name/g' *
Alex

1

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

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

例えば:

virtualenv-mv myproject project

ただし、これはハッキングしただけです。異常な状況(symlinked virtualenvsなど)で壊れる可能性があるので、注意して(失うわけにはいかないものをバックアップしてください)、問題が発生した場合はお知らせください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.