Перейменування папки 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
Це питання давнє і вже має відповідь, але я маю задатися питанням, чому ОП не могла просто перенести virtualenv туди, де вона була? Очевидно, що це не вирішує бажання перемістити / перейменувати, але чи не відновить це робочий віртуаленв, чи це вже безнадійно порушено?
Малик А. Румі

2
Так, ви маєте рацію, це відремонтувало б віртуальне оточення, але не вирішило б питання.
Флоріан

Листопад 2019 року, Python3. Найкраще рішення для мене описується в aarongorka.com/blog/portable-virtualenv
Самір Садек

Відповіді:


148

Вам потрібно налаштувати встановлення, щоб використовувати відносні шляхи. virtualenvпередбачає це за допомогою --relocatableопції. З документів :

Зазвичай середовища пов'язані з певним шляхом. Це означає, що ви не можете переміщати середовище або копіювати його на інший комп'ютер. Ви можете виправити середовище, щоб зробити його переміщеним за допомогою команди:

$ virtualenv - переїзд ENV

ПРИМІТКА: ENV - це ім'я віртуального середовища, і його потрібно запустити за межами каталогу ENV.

Це зробить деякі файли, створені setuptools або розповсюдженням, використовувати відносні шляхи, а всі сценарії змінять на використання activate_this.py замість розташування інтерпретатора Python для вибору середовища.

Примітка. Ви повинні запустити це після встановлення будь-яких пакетів у середовище. Якщо ви зробите середовище переміщенням, а потім встановіть новий пакет, вам слід знову запустити virtualenv --relocatable.


2
нюанс: Зміна оточення на переїзд перетворює більше, ніж просто дозволяє вам переміщувати папку. (див. Примітку: скопійовано з документів) ... це може мати побічні ефекти.
Бен Робертс

7
Наразі - варіант переїзду має низку питань, і він не гарантовано працює за будь-яких обставин. Не виключено, що варіант буде застарілим у майбутній версії virtualenv. Крім того, це не робить ваші пакети крос-платформними. Ви можете переміщати каталог, але його можна використовувати лише на інших подібних комп'ютерах.
Демз

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venvдопоможе знайти будь-які шабанги, які використовують старий venv, але це не повна перевірка переміщеного venv.
варильні панелі

2
Крім того, вам доведеться відредагувати .projectфайл virtualenvwrapper , який містить шлях до вихідного коду, який залежить від virtualenv, припускаючи, що ви використовуєте virutalenvwrapper, а також перейменували проект dir, щоб він відповідав новому virtualenv.
варильні панелі

Мені довелося деактивувати virtualenv перед тим, як запустити це.
antonagestam

108

Я вважаю, що "знати, чому" має значення більше, ніж "знати як" . Отже, ось ще один підхід до виправлення цього.

Під час запуску . env/bin/activateвін фактично виконує такі команди (використовуючи, /tmpнаприклад):

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

Однак ви просто перейменовані myprojectна project, тому команду не вдалося виконати. Ось чому це говорить 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/pipрядок 1:

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

Після цього envзнову активуйте віртуальне середовище , і ви побачите, що ваше pipповернулося знову.


6
Якщо бажано змінити контури вручну, то слід зазначити, що існує більше двох жорстко закодованих файлів. Знайти їх все з чим - щось на кшталт: grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name. Насправді я помітив, що в одному з моїх примірників Джанго багато пакетів мали в них "шлях до Python sh-bang".
Кевін

Це мені дуже допомогло. Мені точно потрібно було знати, чому ... Дякую!
Джарвіс

На відміну від коментаря Кевена вище, я вважаю, що редагування цих двох рядків вирішує для мене всі проблеми щодо переїзду virtualenv. Можливо, є якийсь випадок використання, який я не використовую, тому не стикаюся з проблемою.
Делете

Почешіть це! Сьогодні я зіткнувся з проблемою: ipython не працюватиме в межах virtualenv. Щоб вирішити це, я відредагував заголовок bash (як це називається?) У ipythonфайлі, а потім він добре працював.
Делете

Хм, це не працює для мене, і, здається, у мого скрипта активації немає рядка 1, про який йдеться у кроці 2. Чи щось змінилося?
Еван Замір

40

ПРИМІТКА: Як @jb. вказує, що це рішення стосується лише легко (повторно) створених virtualenvs. Якщо для встановлення цього середовища потрібне декілька годин, не рекомендується


Virtualenvs чудові тим, що їх легко зробити та перемкнути; вони не дозволяють вам замикатися в єдиній конфігурації. Якщо ви знаєте вимоги проекту або можете їх отримати, Створіть нове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, щоб зробити речі трохи простішими, оскільки всі virtualenvs зберігаються в централізованому місці

$(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потрібно кілька годин (складання сторонніх розширень C на малиновому пі).
jb.

4
Можливо, правда, але це здається мені кращим випадком. Я все ще думаю, що це може бути прийнятним рішенням у багатьох випадках.
bnjmn

Так, для багатьох проектів (наприклад, веб-сайт Django) потрібно всього 30 секунд, щоб встановити все, навіть якщо у них є кілька десятків залежностей (за умови, що ви спочатку скачаєте все та використовуєте '--no-index --find-links = downloadDir' )
Джонатан Хартлі

1
@bnjmn однолінійний virtualenv env && pip install -r requirements.txtНЕ встановить вимоги в новому середовищі, оскільки ви його не активуєте
Yarin

1
@Yarin Дякую, що вказали на це. Я цілком пропустив це, будучи virtualenv-wrapperсамим користувачем (що автоматично активує створення). Я оновив свою відповідь, щоб включити активацію virtualenvв надії уникнути будь-якої плутанини.
bnjmn

28

Я завжди встановлюю virtualenvwrapper, щоб допомогти. З підказки:

pip install virtualenvwrapper

У документах virtualenvwrapper є зафіксований спосіб - cpvirtualenv Це те, що ви робите. Переконайтеся, що ви перебуваєте поза своїм оточенням і повертаєтесь до підказок оболонки. Введіть це з потрібними іменами:

cpvirtualenv oldenv newenv

А потім, якщо потрібно:

rmvirtualenv oldenv

Щоб перейти до вашого newenv:

workon newenv

1
Відповідь Afrowave справді має бути прийнятим методом.
Jaxian

Це працює лише в тому випадку, якщо хтось використовує virtualenvwrapper, а не просто virtualenv. Ця відповідь від @ryankdwyer є кращою.
LS

Я відредагував свою відповідь, щоб відобразити, що слід встановити "virtualenvwrapper". Припускаючи, що перейменування віртуальних середовищ трапляється багато, я рекомендував би такий спосіб.
Afrowave

Хоча він покладається на virtualenvwrapper, він є найпростішим. І це добре працює.
blasrodri

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

13

Ще один спосіб зробити це, який працював на мене багато разів без проблем, - це virtualenv-clone :

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

Це слід відзначити як найкращу відповідь. Руки вниз! Для клонування знадобився якийсь час, тому запасіться терпінням, хлопці.
Amitrajit Bose

virtualenv-клон нехтує оновленням підказки. Довелося робити це вручну. Крім цього, це чудово.
користувач3667349

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' *для маків
Алекс

1

virtualenv --relocatable ENVне є бажаним рішенням. Я припускаю, що більшість людей хочуть можливість перейменувати virtualenv без будь-яких довгострокових побічних ефектів.

Тому я створив простий інструмент зробити саме це. Сторінка проекту для virtualenv-mv окреслює його дещо детальніше, але по суті ви можете використовувати так virtualenv-mvсамо, як і просту реалізацію mv(без будь-яких варіантів).

Наприклад:

virtualenv-mv myproject project

Зауважте, однак, що я просто зламав це. Він може зламатися за незвичних обставин (наприклад, пов'язані між собою віртуоли), тому будь ласка, будьте обережні (створіть резервну копію того, що ви не можете дозволити собі втратити) та повідомте мені, якщо у вас виникнуть якісь проблеми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.