Как скопировать virtualenv


132

У меня уже есть virtualenv с большим количеством пакетов, но старая версия Django.

Я хочу продублировать эту среду, чтобы у меня была другая среда с точно такими же пакетами, но с более новой версией Django. Как я могу это сделать?


3
Я бы заморозил все ваши требования в файле «requirements.txt», создал еще один файл virtualenv и запустил pip install requirements.txt
Кэлвин Ченг

Если версия виртуальной среды python, которую вы хотите скопировать, отличается от вашей среды python по умолчанию, вы можете настроить новую среду как virtualenv -p /path/to/older/venv/bin/python new_venvи затем использовать requirements.txtсозданную послеpip freeze
GiriB

Ответы:


185

Самый простой способ - использовать pip для создания файла требований. Файл требований - это в основном файл, который содержит список всех пакетов Python, которые вы хотите установить (или уже были установлены в случае файла, созданного pip), и их версий.

Чтобы создать файл требований, войдите в исходный файл virtualenv и запустите:

pip freeze > requirements.txt

Это сгенерирует для вас файл requirements.txt . Если вы откроете этот файл в своем любимом текстовом редакторе, вы увидите что-то вроде:

Django==1.3
Fabric==1.0.1
etc...

Теперь отредактируйте строку, Django==x.xв которой говорится Django==1.3(или любую другую версию, которую вы хотите установить в своем новом virtualenv).

Наконец, активируйте свой новый virtualenv и запустите:

pip install -r requirements.txt

И pip автоматически загрузит и установит все модули python, перечисленные в вашем файле requirements.txt , в любых версиях, которые вы указали!


3
Спасибо! Во время поиска в Google я обнаружил так много шумных, беспорядочных и запутанных страниц ... Ваше решение настолько чистое и простое ... оно сделало мой день;)
dolma33

что, если я скопирую папку, а затем вставлю ее на другой компьютер? Это сработает? При условии, конечно, что зависимости apt-get были решены
Tales Pádua

На самом деле это не так, как я только что выяснил.
horcle_buzz 07

Я вижу много сообщений. Could not find a version that satisfies the requirement a_package=#.#.#Могу ли я решить эту проблему легко? Я удалил строчку или заменил равенство на неравенство.
Измени-мир

Также работает pyenv. Отличный ответ.
Леонард

29

Другой вариант - использовать virtualenv-cloneпакет:

Скрипт для клонирования не перемещаемого файла virtualenv.


Привет, я прав, что это позволяет мне скопировать ВСЕ среду python в файл. Тогда мне просто нужно было бы загрузить этот файл на новый компьютер / ОС, и я бы установил все свои пакеты сайта обратно
aceminer

2
"virtualenv-clone source / target /" работал как шарм, спасибо!
ajankuv

убедитесь, что мы установили virtualenv-cloneпосле активации virtualenv
4givN

15

virtualenvwrapperпредоставляет команду для дублирования virtualenv

cpvirtualenv ENVNAME [TARGETENVNAME]

7
Не очень хорошая идея. «Копирование виртуальных сред плохо поддерживается. Каждый virtualenv имеет информацию о пути, жестко закодированную в нем, и могут быть случаи, когда код копирования не знает, что ему нужно обновить конкретный файл. Используйте с осторожностью».
Temak

6

Если вы используете Anaconda, вы можете просто запустить:

conda create --name myclone --clone myenv

Это будет скопировано myenvво вновь созданную среду с именем myclone.


4

Самый простой вариант - использовать virtualenv-clonepackage.

Для того, чтобы дублировать venv1на venv2, выполните следующие действия:

  1. Установите virtualenv-cloneв любой venv1виртуальной среде или в фиктивной виртуальной среде venv_dummy. Для создания venv_dummy:

    python -m virtualenv venv_dummy
    source venv_dummy/bin/activate
    
  2. Для установки virtualenv-clone:

    (venv_dummy): pip install virtualenv-clone
  3. Для копирования venv1на venv2:

    (venv_dummy): virtualenv-clone venv1/ venv2/

приглашение в bash не меняется, нужно отредактировать bin / activate, и не на 100% понятно, как
MrR

@MrR .. вам не нужно редактировать, bin/activateесли вы последуете этому ответу. Почему нужно редактировать bin/activate?
Сафван,

После клонирования мое приглашение в bash имело исходное имя среды из-за раздела PS1 внутриbin/activate
MrR

1
@MrR Это похоже на ошибку или недосмотр в virtualenv-clone, но это не должно влиять на поведение.
Джо Холлоуэй,

1

Можно не просто:

  • Скопируйте существующий виртуальный каталог env в новый
  • Обновиться до нового Django?

7
Иногда я использую этот подход, но возникает неудобство, связанное с обновлением некоторых путей внутри скрипта bin / activate.
Armando Pérez Marqués

3
Является ли изменение простым поиском и заменой ссылок на имя env или это сложнее?
Грег

1
В моем случае простое обновление пути в константе VIRTUAL_ENV в bin / activate
помогло

1
С другой стороны, изменение bin / activate - это настоящий взлом, и нужно задаться вопросом, может ли это когда-нибудь сломаться. Особенно, когда виртуальные среды используются в производственных условиях.
Герберт

2
Это действительно ломает многое. Легче просто воссоздать или клонировать virtualenv. Я попытался сделать именно это (ожидая открытия прокси-сервера, чтобы я мог переустановить все необходимые пакеты и просто начать с нуля), и это не работает! Я думал, что поступил умно, но, увы, потребуется много взлома, чтобы все это заработало, и, честно говоря, есть вещи гораздо лучше.
horcle_buzz 07
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.