Czy mogę przenieść virtualenv?

89

To pytanie nie jest powtórzeniem.

Dotyczy to nie tylko zmiany nazwy środowiska wirtualnego, ale faktycznego przeniesienia go do innego katalogu, w tym potencjalnie do katalogu innego użytkownika.

To nie to samo, co zwykła zmiana nazwy środowiska wirtualnego, zwłaszcza dla osób niezaznajomionych z wirtualnymi envami.

Jeśli utworzę virtualenv i przeniosę go do innego folderu, czy nadal będzie działać?

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

... później tego dnia wirtualne środowisko PRZENOSIŁO SIĘ ...

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

Pytanie:

Czy to zadziała?

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

Mam tu na myśli mniejszą kwestię dotyczącą sensowności próbowania tego (chyba że ta mądrość jest oczywiście zabawna), a więcej, czy jest to możliwe. Naprawdę chcę wiedzieć, czy można to zrobić w Pythonie 3, czy też muszę to po prostu wyssać i sklonować.

Mogę tylko tak bez smutku? Chcę uniknąć smutku.mvvirtualenv

Nathan Basanese
źródło

Odpowiedzi:

69

Tak. Możliwe jest przenoszenie go na tej samej platformie. Możesz użyć --relocatablew istniejącym środowisku.

Od --help:

--relocatable - umożliwia relokowanie ISTNIEJĄCEGO środowiska virtualenv. To naprawia skrypty i sprawia, że ​​wszystkie pliki .pth są względne.

JEDNAK NIE wydaje się to zmieniać activateskryptu, a raczej zmienia tylko skrypty pip*i easy_install*. W activateskrypcie $VIRTUAL_ENVzmienna środowiskowa zakodowana na stałe jako oryginał /path/to/original/venv. $VIRTUAL_ENVZmienna jest używana do ustawienia PATHswojego aktywnego środowiska też, więc to musi być zmienione na podstawie nowej lokalizacji w celu wywołania pythoni pipitd. Bez ścieżki bezwzględnej.

Aby rozwiązać ten problem, możesz zmienić $VIRTUAL_ENVzmienną środowiskową w activateskrypcie (na przykład używając sed) i wszystko powinno być gotowe.

Przykład użycia:

$ 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

Hura, teraz możesz zainstalować rzeczy i załadować je do nowo zlokalizowanego środowiska wirtualnego.

hilcharge
źródło
//, Hm. Wydaje się, że w rzeczywistości nie oznacza to, że można je przenieść. Ciągle otrzymuję błąd, że nie są to „normalne” pliki skryptów.
Nathan Basanese
7
„Opcja --relocatable ma obecnie wiele problemów i nie gwarantuje, że będzie działać w każdych okolicznościach. Jest możliwe, że ta opcja zostanie wycofana w przyszłej wersji virtualenv. ” (
Wyróżnienie
1
Próbowałem tego na Windowsie i błąd wyświetla wszystkie skrypty (* .py, * .bat, * .ps1) w katalogu Scripts(odpowiednik binon * nix) i mówi coś w stylu, że w activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.zasadzie narzeka, że ​​hash-bang w pliku Nagłówek nie jest bieżącym python.exe virtualenv, jest to ten, z którego go przeniosłem - łatwa naprawa. Zajrzałem do tego szykownego scenariusza, a on i tak już odkrywa własną ścieżkę - fajnie. Niektóre inne skrypty również nie opierają się na ścieżkach (np. Dezaktywować.bat), więc w skrócie to działa.
Davos
2
@NathanBasanese wiadomość activate.ps1 cannot be made relativemożna zignorować, ponieważ ten skrypt jest już względny. Komunikat nie jest pomocny w systemie Windows, ponieważ skrypty nie używają #!dyrektyw, jak w Linuksie, aby powiedzieć powłoce, która aplikacja powinna ją wykonać. Nie activate.batjest modyfikowany, ale nie jest używany (przynajmniej w Windows 10, wywołanie activateuruchamia skrypt PoSH), więc nie, nie musiałem edytować żadnych skryptów. Problem polega na pip.exetym, że ścieżka do Pythona jest zakodowana na stałe i wymaga edycji za pomocą edytora szesnastkowego lub po prostu ponownej instalacji.
Davos
3
@Sgedda Z perspektywy czasu powiedziałbym, że nie rób tego. Twoje środowiska Pythona powinny być łatwe do odtworzenia przy użyciu co najmniej pip freezepliku wymagań, abyś mógł łatwo ponownie zainstalować wszystkie swoje pakiety, docker (działa dobrze z zainstalowanym na nim virtualenv), conda, pyenv lub inne narzędzia. Powinieneś móc tworzyć i niszczyć środowiska jako niezmienną infrastrukturę, nie powinny one być cenne.
Davos
15

Dla Pythona 3.3+ (z nowym venvwbudowanym modułem)

Krótka odpowiedź (niezależnie od wersji):

  • Nie ma czystego, bezpośredniego sposobu na przeniesienie środowiska wirtualnego
  • Po prostu odtwórz, to proste !!


Długa odpowiedź:

Począwszy od wersji 3.3, Python virtualenvstał się wbudowanym modułem o nazwie venv.

--relocatableOpcja wspomniano w innych odpowiedzi nie została włączona venv, a obecnie nie ma dobra, bezpieczna droga, że jestem świadom, aby zmienić nazwę lub przenieść do wirtualnego środowiska Pythona.

Istnieje jednak dość prosty sposób na odtworzenie środowiska wirtualnego ze wszystkimi aktualnie zainstalowanymi pakietami. Zobacz tę odpowiedź lub zobacz sekcję poniżej, aby uzyskać informacje na temat odtwarzania środowiska wirtualnego. Podczas tego procesu możesz odtworzyć nowe środowisko w dowolnym miejscu i pod dowolną nazwą. Lub zobacz sekcję poniżej, aby zapoznać się z procesem.

W tej odpowiedzi wspomina o kilku innych pakietach innych firm, które mogą obsługiwać bezpośrednie zmiany nazw lub ruchy. Jeśli zależy Ci na znalezieniu sposobu na przeniesienie środowiska wirtualnego w nienaruszonym stanie, możesz sprawdzić, czy one venvrównież działają.

Uwaga: w tej odpowiedzi skupia się virtualenvraczej na niż venv. Zobacz poniżej, jak tłumaczyć.



venvw porównaniu ze starszą virtualenvskładnią poleceń

Polecenie do użycia venvto:

python -m venv

a nie tylko virtualenv, który instaluje się jako polecenie w oryginalnym pakiecie. Gdzie „python” odnosi się do tego, jak uruchamiasz plik wykonywalny pythona, którym może być wiele różnych rzeczy, takich jak:

  1. python
  2. pylub py -3.7podobny ( Python Launcher for Windows for Python 3.3+ i Windows tylko w tej chwili)
  3. python3 (konwencja dla środowisk linux, które instalują podwójnie Python 2 i 3)
  4. Jeśli masz problemy, użyj bezwzględnej ścieżki do pliku wykonywalnego Pythona, który chcesz uruchomić: np c:\program files\python37\python.exe

Jeśli nie masz pewności, która wersja jest uruchamiana, zawsze możesz python --versionsię dowiedzieć.



Jak odtworzyć środowisko wirtualne

Tworzenie / odtwarzanie wirtualnego środowiska jest łatwe i powinno stać się drugą naturą po dłuższej pracy z nim. Ten proces odzwierciedla to, co zrobiłbyś, aby rozpowszechnić swój skrypt jako pakiet (wraz z jego zależnościami) w pierwszej połowie, a następnie co ktoś zrobiłby, aby zainstalować twój skrypt / pakiet do dalszego rozwoju.

Najpierw uzyskaj zaktualizowaną listę tego, co znajduje się w środowisku wirtualnym. Gdy jest aktywna, pobierz wersję Pythona, której używa, i zapisz listę zależności do pliku.

  1. Używaj python --versionz aktywowanym środowiskiem wirtualnym, aby zobaczyć, jakiej wersji Pythona używa.

    • Jest to dla jasności - możesz chcieć zaktualizować wersję Pythona z różnych powodów - przynajmniej do najnowszej wersji poprawki
    • Na przykład, jeśli istniejący venv korzysta z Pythona w wersji 3.7.4, ale teraz wersja 3.7.6 jest niedostępna - zamiast tego użyj wersji 3.7.6, która powinna zawierać tylko nierozerwalne zabezpieczenia i poprawki błędów.
  2. Służy python -m pip freeze > requirements.txtdo tworzenia listy bieżących zależności pakietów i umieszczania ich w requirements.txtpliku. To polecenie na pewno działa w systemie Linux lub Git Bash - nie mam 100% pewności co do Powershell lub wiersza poleceń w systemie Windows.

Teraz utwórz nowe środowisko wirtualne, a następnie dodaj zależności ze starego.

  1. Zrób swój nowy venv.

    • Upewnij się, że używasz poprawnej wersji Pythona, którą chcesz zainstalować na venv.
    • Jeśli chcesz, aby była to dokładnie ta sama wersja Pythona:
      • Uruchom Pythona bezpośrednio z bieżącego środowiska wirtualnego (z aktywowanym) i użyj pythonjako polecenia
      • Lub użyj ścieżki bezwzględnej python.exew folderze środowiska wirtualnego
    • Dla nowego wpisu folderu venv w poleceniu:
      • Dodaj bezwzględną lub względną ścieżkę do żądanej lokalizacji folderu końcowego.
      • Służy python -m venv my_new_venvdo tworzenia nowego środowiska wirtualnego w bieżącym katalogu roboczym w nowym my_new_venvfolderze.
      • Nazwa folderu venv będzie nazwą folderu venv (co pojawia się w monicie, gdy jest aktywowany).
  2. Zainstaluj zależności z requirements.txtpliku.

    • python -m pip install -r requirements.txt

Może być konieczne ponowne zainstalowanie pakietów lokalnych, które są w trybie programowania.

Uwaga, jeśli kiedykolwiek będziesz potrzebować zobaczyć konkretną lokalizację, w której pakiet jest zainstalowany, użyj:

  • python -m pip list -v
  • Opcja -vlub „verbose” doda dodatkowe informacje o każdym zainstalowanym pakiecie, w tym o ścieżce, w której jest on zainstalowany. Jest to przydatne, aby upewnić się, że pakiety wirtualne, zainstalowane przez użytkownika i zainstalowane przez system są proste.

W tym momencie możesz po prostu usunąć stary folder venv i całą zawartość. Zalecam używanie do tego GUI - usuwanie plików jest często trwałe z linii poleceń Linuksa, a mała literówka może być złą wiadomością.

LightCC
źródło
Czy nie ma sposobu na skopiowanie stanu pip venv, tj. Bez konieczności ponownego pobierania wszystkich bibliotek za pomocą pip?
Aydo
Nie jestem pewien, dlaczego chciałbyś to zrobić - czy jest to spowodowane ekstremalnie niską przepustowością w Internecie lub ogromną potrzebą duplikowania? Wierzę, że można by pobrać wszystkie zamki błyskawiczne z pypi, a następnie zainstalować je lokalnie, ale nie jestem na bieżąco z tym. Wiem, że możesz skonfigurować lokalny serwer pip do obsługi pakietów.
LightCC
Problem (który próbuję rozwiązać) polega na tym, że chcę uruchomić skrypt Pythona na maszynie, która nie zezwala na ruch sieciowy do pip (lub prawie wszędzie). Mogę umieszczać na nim pliki, ale nie może rozmawiać z pip. Na pewno niszowy przypadek, ale dokładnie dlaczego muszę przenieść te rzeczy.
Richard Rast
@RichardRast To inny problem, odpowiadam tylko na oryginalne pytanie. Uwaga: istnieją rozwiązania problemu (pobieranie pakietów w postaci zip i instalacja lokalna, uruchamianie serwera lustrzanego PyPi za zaporą sieciową itp.), Ale to nie jest właściwe: pytania i odpowiedzi na ten temat ...
LightCC
2
Możesz utworzyć koła ze wszystkich swoich pakietów, pip wheel . -w wheelsa następnie po prostu ponownie zainstalować pakiety w nowym środowisku wirtualnym zpip install --no-index --find-links /path/to/wheels/ -r requirements.txt
np8
7

--relocatableArgument virtualenvwydaje pozwalają to zrobić.

Ruth Franklin
źródło
//, Czy to po prostu opiera się na ścieżkach względnych, czy w jakiś sposób inaczej?
Nathan Basanese,
1
--relocatable działa tylko w istniejących środowiskach wirtualnych. Uruchom, virtualenv --relocatable my-python-venvgdy środowisko już istnieje.
hilcharge
1
Od --help: This fixes up scripts and makes all .pth files relative. Nie, to nie spowoduje, że biblioteki będą niezależne od platformy. Jeśli chcesz przenieść go na inną platformę, musisz zainstalować go ponownie w oparciu o lokalny Python.
hilcharge
5
moduł python3 venv nie obsługuje tej flagi
Nelson
7

ALE NIESTETY:

Nie, po prostu nie możesz mv. Istnieją obejścia, ale ponowna instalacja może być łatwiejsza.

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

... naciska entermocno z frustracji, a następujące rzeczy działają

$
$
$ pip3 search foaas

Tyle że nie jest z my-python-venv, ergo smutku.

Chcesz mvTWOJEJ virtualenvi używać go, inaczej niemodyfikowana?

Krótka odpowiedź:

Pozwolę Boromirowi to powiedzieć, aby mógł to wyjaśnić:

Cóż, nie możesz .

Nathan Basanese
źródło
2
chyba że chcesz uzyskać krwawość i odpowiednio ją zmodyfikować: to linki w plikach binarnych w koszu powodują problem z ruchem. Jeśli wiesz, skąd pochodzisz, możesz użyć czegoś takiego, jak find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;zakładanie, że twój bin i lib znajdują się w twoim bieżącym folderze venv. Używam tego jako szybkiego i brudnego sposobu na kopiowanie i przenoszenie wirtualnych środowisk env python3 z wieloma zainstalowanymi pakietami pip.
Paul Whipp,
1
@PaulWhipp Czy jest jakaś korzyść z używania tego polecenia w porównaniu z samym używaniem --relocatable? Poza tym, Nathanie, świetne pytanie, ale to okropna odpowiedź. Zaakceptowanie własnej odpowiedzi jest zawsze trochę stronnicze, chyba że jest dobrze napisana i jasno wylicza opcje, ale i tak określa, że ​​ty i tak będziesz subiektywny.
Davos
1
@Davos --relocatable nie działało dla mnie, ale rutynowo przenoszę venvy pythona3, hakując pliki binarne i jak dotąd nie miałem żadnych problemów.
Paul Whipp
1
Zasugerowałem, że powinieneś zmienić zaakceptowaną odpowiedź na inną (tj. Nie swoją) odpowiedź Być może tę, którą wybrali ludzie: D
Davos
3
Pytanie brzmiało „czy mogę po prostu mvsprzedać?”, A odpowiedź brzmi „nie, nie możesz po prostu mv, istnieją obejścia, ale może być łatwiejsza ponowna instalacja”. Gdyby to była najlepsza odpowiedź, zaoszczędziłoby mi to i innym trochę czasu.
Nickolay
5

Tak, powinno to być możliwe, jeśli nie zrobiłeś niczego, co zależy od bieżącego katalogu virtualenv.

Jeśli jednak masz wybór, najlepiej jest utworzyć nowy virtualenv i zamiast tego zacząć używać nowego virtualenv. Jest to najbezpieczniejszy wybór i najmniej prawdopodobny późniejszy problem.

Dokumentacja wspomina, że :

Każdy virtualenv ma zakodowane na stałe informacje o ścieżce,

Na przykład, jeśli uruchomiłeś setvirtualenvproject, nie będzie w stanie przełączyć się do właściwego katalogu po uruchomieniuworkon ... więc w takim przypadku musisz to naprawić ręcznie.

Ogólnie virtualenv to niewiele więcej niż katalog z niezbędnymi plikami interpretera języka Python oraz pakietami, których potrzebujesz.

Simeon Visser
źródło
2

Korzystając z odpowiedzi na ten i inne wątki na podobny temat, stworzyłem skrypt bash, który, zlokalizowany i wykonany w samym katalogu virtualenv pomoże w twoich ruchach w virtualenv.

Po wykonaniu tej czynności virtualenv --relocatable yourenvbędziesz musiał zmieniać VIRTUAL_ENVzmienną za każdym razem, gdy przenosisz katalog, więc jeśli nie chcesz zmieniać jej ręcznie, użyj tego.

#!/bin/bash \n 
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
EXISTING=$(grep 'VIRTUAL_ENV=' bin/activate)  
NEWDIR=VIRTUAL_ENV=\"$DIR\"
sed -i -e "s|$EXISTING|$NEWDIR|" bin/activate
source bin/activate

Mam nadzieję, że to pomoże.

Gerbs
źródło
0

TAK, MOŻESZ! (W windows)

Obejście jest łatwe, po prostu przenieś swoje wirtualne środowisko w dowolne miejsce, a następnie edytuj activate.batw nim scripts\:

  1. Przejdź do środowiska wirtualnego do żądanego katalogu

  2. Kliknij prawym przyciskiem myszy i edytuj activate.batw venv_folder\scripts.

  3. Zmień VIRTUAL_ENVzmienną z:

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    w

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. Zapisz edytowany plik wsadowy i to wszystko!

UWAGA: Moje rozwiązanie powinno działać i zapisywać windows userskonfigurację nowych środowisk wirtualnych, wątpię, aby zadziałało w innym systemie operacyjnym, ponieważ .batpochodzi zMS-DOS

kyle olodin
źródło
Zmień old_directoryna old_directory- czy to literówka?
potwierdzenie
aww cholera, tak, dziękuję
kyle olodin