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

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

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


person dolma33    schedule 15.09.2011    source источник
comment
Я бы заморозил все ваши требования в файле 'requirements.txt', создал еще один virtualenv и запустил pip install requirements.txt   -  person Calvin Cheng    schedule 16.09.2011
comment
Если версия виртуальной среды Python, которую вы хотите скопировать, отличается от среды Python по умолчанию, вы можете настроить новую среду как virtualenv -p /path/to/older/venv/bin/python new_venv, а затем использовать requirements.txt, созданный после pip freeze   -  person GiriB    schedule 17.04.2017
comment
@CalvinCheng, это pip install -r requirements.txt   -  person Ferdi    schedule 22.01.2021


Ответы (8)


Самый простой способ - использовать 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, в любых версиях, которые вы указали!

person rdegges    schedule 15.09.2011
comment
что, если я скопирую папку, а затем вставлю ее на другой компьютер? Это сработает? Если, конечно, зависимости apt-get были разрешены - person Tales Pádua; 04.03.2016
comment
На самом деле это не так, как я только что выяснил. - person horcle_buzz; 07.07.2016
comment
Я вижу много сообщений Could not find a version that satisfies the requirement a_package=#.#.# Могу ли я легко решить эту проблему? Я удалил строчку или заменил равенство на неравенство. - person Change-the-world; 02.04.2018
comment
Также работает для pyenv. Отличный ответ. - person Leonard; 12.01.2020
comment
Пока что для меня это лучший подход. - person Valentin; 16.03.2021

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

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

person alecxe    schedule 24.05.2013
comment
Привет, я прав, что это позволяет мне скопировать ВСЕ среду python в файл. Тогда мне просто нужно было бы загрузить этот файл на новый компьютер / ОС, и я бы снова установил все свои пакеты сайта. - person aceminer; 06.06.2016
comment
virtualenv-clone source / target / работал как шарм, спасибо! - person ajankuv; 21.06.2018
comment
убедитесь, что мы установили virtualenv-clone после активации virtualenv - person 4givN; 09.12.2019
comment
Синтаксис python -m clonevirtualenv source/ target/ - person Georg W.; 18.12.2020

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

cpvirtualenv ENVNAME [TARGETENVNAME]
person Raymond    schedule 04.05.2017
comment
Не очень хорошая идея. Копирование виртуальных сред не поддерживается. Каждый virtualenv имеет информацию о пути, жестко закодированную в нем, и могут быть случаи, когда код копирования не знает, что ему нужно обновить конкретный файл. Используйте с осторожностью. - person Temak; 14.11.2017
comment
Можете ли вы вместо имени указать путь к venv? - person anilbey; 11.02.2021

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

conda create --name myclone --clone myenv

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

person Jordan    schedule 03.06.2018

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

Чтобы скопировать 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/
    
person Safwan    schedule 14.01.2020
comment
приглашение в bash не меняется, нужно отредактировать bin / активировать и не на 100% ясно, как - person MrR; 15.06.2020
comment
@MrR .. вам не нужно редактировать bin/activate, если вы последуете этому ответу. Зачем нужно редактировать bin/activate? - person Safwan; 15.06.2020
comment
После клонирования мое приглашение в bash имело исходное имя среды из-за раздела PS1 в bin/activate - person MrR; 15.06.2020
comment
@MrR Это похоже на ошибку или недосмотр в virtualenv-clone, но это не должно влиять на поведение. - person Joe Holloway; 04.08.2020
comment
если имя не изменилось в соответствии с @MrR, перейдите в файл новой среды bin/activate, найдите старое имя env и установите новое имя. Вуаля! Переименовать нужно будет 2 раза. Удачи!! - person Sachin Mohan; 08.01.2021
comment
Замените блок запуска с if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then с этого - person MrR; 10.01.2021
comment
Кстати, это должен быть главный ответ ... - person MrR; 10.01.2021

Вот моя команда для клонирования виртуальных сред Python.

packs=`source-path/bin/pip freeze` && python3 -m venv <env-name> && target-path/bin/pip install $packs

Условные обозначения, используемые в приведенной выше команде:

  • source-path = путь к env, который вы хотите клонировать, например. /home/john/envs/oldenv.
  • env-name = имя клонированного окружения, например. myenv, это также может быть путь, например /home/john/envs/myenv
  • target-path = путь к новому клонированному окружению, например. /home/john/envs/<env-name>

Преимущества использования этого или почему я предпочитаю это

  1. Нет необходимости создавать файл requirements.txt.
  2. Во время клонирования никакая среда не активируется / деактивируется.
  3. одна команда для выполнения (одновременно выполняются 3 команды).

В некоторых случаях вы можете захотеть исключить глобальные пакеты из при клонировании env, вы можете заменить source-path/bin/pip freeze на source-path/bin/pip freeze --local, подробнее о --local здесь

person Hemant Malik    schedule 27.02.2021

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

  • Скопируйте существующий виртуальный каталог env в новый
  • Обновиться до нового Django?
person Spacedman    schedule 16.09.2011
comment
Иногда я использую этот подход, но возникает неудобство, связанное с необходимостью обновления некоторых путей внутри скрипта bin / activate. - person Armando Pérez Marqués; 16.09.2011
comment
Является ли изменение простым поиском и заменой ссылок на имя env или это сложнее? - person Greg; 03.08.2012
comment
В моем случае простое обновление пути в константе VIRTUAL_ENV в bin / activate помогло - person bryanph; 18.06.2015
comment
С другой стороны, изменение bin / activate - это настоящий взлом, и нужно задаться вопросом, может ли это сломать что-то в какой-то момент. Особенно, когда виртуальные среды используются в производственных условиях. - person Herbert; 25.04.2016
comment
Это действительно ломает многое. Легче просто воссоздать или клонировать virtualenv. Я попытался сделать именно это (ожидая открытия прокси-сервера, чтобы я мог переустановить все необходимые пакеты и просто начать с нуля), и это не работает! Я думал, что поступил умно, но, увы, потребуется много взлома, чтобы все это заработало, и, честно говоря, есть вещи гораздо лучше. - person horcle_buzz; 07.07.2016
comment
@minghua Ваша правка многое добавляет к ответу, я предлагаю добавить отдельный ответ вместо правки. - person Ajay Brahmakshatriya; 16.05.2017
comment
Это имеет проблемы с индексированием в среде Python, которую вы пытаетесь настроить на сервере. Когда вы просто копируете каталог paste virtualenv прямо в нужную систему, некоторые файлы в папке Include имеют абсолютные пути для привязки различных компонентов, и теперь это происходит из-за изменений в вашей новой системе. Таким образом, вы сможете активировать этот новый env, но не использовать его пакеты. - person Yashash Gaurav; 28.09.2018
comment
Исправить нужно не только корзину / активировать. Посмотрите на шабанги других скриптов в bin /. Они указывают на исходный путь питона venv. Я бы использовал ответ от @rdegges и заморозил. - person sqqqrly; 13.11.2019

Если вы используете pip venv. Я копирую вставленную папку, содержащую виртуальную среду, и вручную меняю файлы в папке bin скопированной папки. Не знаю, эффективно ли это, но работает!

person Community    schedule 27.02.2021
comment
Привет, Саи Сударсанан Д, и добро пожаловать в StackOverflow! Прочтите, пожалуйста, как написать хороший ответ - person BiOS; 28.02.2021