Могу ли я переместить virtualenv? [дубликат]

этот вопрос уже есть ответ здесь:

этот вопрос не дубликат.

это относится не только к переименовать виртуальная среда, но на самом деле двигаясь это в другой каталог, включая, потенциально, каталог другого пользователя.

Это не то же самое, что просто переименование виртуальной среды, особенно для людей, незнакомых с virtualenvs.

если я создам 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 как это без грусти? Я хочу избежать печали.

4 ответов


да. Его можно перемещать на одной платформе. Вы можете использовать --relocatable в существующей среде.

С --help:

--relocatable -- сделайте существующую среду virtualenv relocatable. Это исправляет скрипты и делает все .ПТГ файлов относительное.

однако это, похоже, не меняет activate скрипт, а точнее только изменяет pip* и easy_install* скрипты. В activate скрипт $VIRTUAL_ENV переменная окружения жестко закодирована как исходная /path/to/original/venv. The $VIRTUAL_ENV переменная используется для задания PATH вашей активной среды тоже, поэтому он должен быть изменен на основе нового местоположения, чтобы вызвать python и pip etc. без абсолютного пути.

чтобы устранить эту проблему, вы можете изменить $VIRTUAL_ENV переменная окружения в activate скрипт (например с помощью 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

Ура, теперь вы можете устанавливать вещи и загружать их в свою новую виртуальную среду.


на


Да, это должно быть возможно, если вы не сделали ничего, что зависит от текущего каталога virtualenv.

однако, если у вас есть выбор, лучше всего создать новый virtualenv и начать использовать новый virtualenv вместо этого. Это самый безопасный выбор и наименее вероятно, чтобы вызвать проблемы позже.

документация не говоря уже о том, что:

каждый virtualenv имеет информацию о пути, жестко закодированную в него,

например, если вы бежите setvirtualenvproject тогда он не сможет переключиться в правильный каталог после запуска workon ... поэтому в этом случае вам нужно будет исправить это вручную.

В общем virtualenv - это немного больше, чем каталог с необходимыми файлами интерпретатора Python плюс пакеты, которые вам нужны.


// , НО УВЫ:

(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:

Ну, йа не могу.