web-dev-qa-db-ja.com

virtualenvを移動できますか?

この質問は重複していません。

仮想環境のrenamingだけでなく、実際にはmoving潜在的に別のユーザーのディレクトリを含む、別のディレクトリに移動します。

これは、仮想環境、特にvirtualenvに不慣れな人にとっては、単に仮想環境の名前を変更するのと同じではありません。

Virtualenvを作成し、それを別のフォルダーに移動しても、引き続き機能しますか?

$ virtualenv -p /usr/bin/python3 /home/me/Env/my-python-venv
$ source Env/my-python-venv/bin/activate
(my-python-venv) $ 

...その日、仮想環境が動きました...

(my-python-venv) $ deactivate
$ mkdir -p /home/me/PeskyPartyPEnvs
$ mv /home/me/Env/my-python-venv /home/me/PeskyPartyPEnvs/

質問:

これは機能しますか?

$ source /home/me/PeskyPartyPEnvs/my-python-venv/bin/activate
(my-python-venv) $ /home/me/PeskyPartyPEnvs/my-python-venv/bin/pip3 install foaas

これは、これを試す知恵についての質問ではなく(もちろん、その知恵がユーモラスでない限り)、それが可能かどうかについての質問としてのものです。 Python 3で実行できるかどうか、または 吸い上げ してクローンを作成する必要があるかどうかを本当に知りたいです。

mv a virtualenvのように悲しくなくてもいいですか?私は悲しみを避けたいです。

55
Nathan Basanese

しかし悲しいかな:

いいえ、単にmvすることはできません。回避策はありますが、再インストールする方が簡単な場合があります。

(my-python-venv)$ /home/me/PeskyPartyPEnvs/pip3 install foaas
zsh: /home/me/PeskyPartyPEnvs/pip3: bad interpreter: /home/me/Env/my-python-venv/bin/python3: no such file or directory
(my-python-venv)$ deactivate
$ 

... enterを頻繁に押し、フラストレーションがたまり、次のように動作します

$
$
$ pip3 search foaas

my-python-venvからではないことを除けば、悲しみを感じます。

mvあなたのvirtualenvを使用して、それ以外の場合は変更しませんか?

短い答え:

I'll let Boromir say it, so he can make it clear:

まあ、yaはできません

5
Nathan Basanese

はい。同じプラットフォーム上で移動することが可能です。既存の環境で--relocatableを使用できます。

--helpから:

--relocatable-既存のvirtualenv環境を再配置可能にします。これにより、スクリプトが修正され、すべての.pthファイルが相対的なものになります。

ただし、これはactivateスクリプトを変更するようではなく、pip*およびeasy_install*スクリプトのみを変更するようです。 activateスクリプトでは、$VIRTUAL_ENV環境変数が元の/path/to/original/venvとしてハードコードされています。 $VIRTUAL_ENV変数は、アクティブな環境のPATHの設定にも使用されるため、pythonpipなどを呼び出すには、新しい場所に基づいて変更する必要があります。絶対パスなし。

この問題を解決するには、activateスクリプトの$VIRTUAL_ENV環境変数を変更し(たとえばsedを使用)、すべてがうまくいくはずです。

使用例:

$ cd ~/first
$ virtualenv my-venv
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV="/home/username/first/my-venv"
$ virtualenv --relocatable my-venv
Making script my-venv/bin/easy_install relative
Making script my-venv/bin/easy_install-2.7 relative
Making script my-venv/bin/pip relative
Making script my-venv/bin/pip2 relative
Making script my-venv/bin/pip2.7 relative
### Note that `activate` has not been touched
$ mkdir ~/second
$ mv my-venv ~/second
$ cd ~/second
$ grep 'VIRTUAL_ENV=' my-venv/bin/activate
VIRTUAL_ENV=/home/username/first/my-venv
### (This variable hasn't been changed, it still refers to the old, now non-existent directory!)
$ sed -i -e 's|username/first|username/second|' my-venv/bin/activate
## sed can be used to change the path.
## Note that the `-i` (in place) flag won't work on all machines. 
$ source my-venv/bin/activate 
(my-venv) $ pip install foass
...
(my-venv) $ python 
[...]
> import foass

Hooray、これで物をインストールして、新しく配置された仮想環境にロードできます。

55
hilcharge

virtualenv--relocatable引数は、これを可能にするように見えます。

7
Ruth Franklin

はい、virtualenvの現在のディレクトリに依存することを何もしていない場合、これは可能です。

ただし、選択できる場合は、新しいvirtualenvを作成し、代わりに新しいvirtualenvの使用を開始することをお勧めします。これが最も安全な選択であり、後で問題が発生する可能性が最も低くなります。

ドキュメント それは言及しています

各virtualenvにはハードコードされたパス情報があり、

たとえば、setvirtualenvprojectを実行した場合、workon ...を実行した後に正しいディレクトリに切り替えることができないため、その場合は手動で修正する必要があります。

一般に、virtualenvは、必要なPythonインタープリターファイルと必要なパッケージを含むディレクトリにすぎません。

6
Simeon Visser