Bir sanal ortamı taşıyabilir miyim?


93

Bu soru kopya değil.

Bu sadece değil ilgilidir adlandırma bir sanal ortam, ama aslında hiç hareket , farklı bir kullanıcının dizininde, potansiyel olarak dahil farklı bir dizine.

Bu, yalnızca sanal ortamı yeniden adlandırmakla aynı şey değildir, özellikle de virtualenv'leri bilmeyen kişiler için.

Bir virtualenv oluşturursam ve onu farklı bir klasöre taşırsam yine de çalışır mı?

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

... o günün ilerleyen saatlerinde, sanal ortam TAŞINDI ...

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

Soru:

Bu işe yarayacak mı?

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

Bunu, bunu denemenin bilgeliğiyle ilgili daha az soru (tabii ki bu bilgelik komik değilse) ve daha çok mümkün olup olmadığı hakkında. Python 3'te yapmanın mümkün olup olmadığını veya sadece emip klonlamam gerekip gerekmediğini gerçekten bilmek istiyorum .

Üzülmeden böyle mvbir virtualenvşey yapabilir miyim ? Üzüntüden kaçınmak istiyorum.

Yanıtlar:


70

Evet. Aynı platform üzerinde hareket ettirmek mümkündür. Kullanabilirsiniz--relocatableMevcut bir ortamda .

Kimden --help:

- relocatable - MEVCUT bir sanal ortam ortamını yeniden konumlandırılabilir hale getirin. Bu, komut dosyalarını düzeltir ve tüm .pth dosyalarını göreceli hale getirir.

ANCAK, bu activatekomut dosyasını DEĞİŞTİRMEZ, sadece pip*ve easy_install*komut dosyalarını değiştirir. Gelen activatekomut, $VIRTUAL_ENVortam değişkeni orijinal olarak önceden kodlanmıştır /path/to/original/venv. $VIRTUAL_ENVDeğişken ayarlamak için kullanılır PATHonu çağırmak için yeni yere göre değiştirilmesi gerekir, böylece çok etkin çevrenin pythonve pipvb mutlak yolu yoktur.

Bu sorunu düzeltmek için $VIRTUAL_ENV, activatekomut dosyasındaki ortam değişkenini değiştirebilirsiniz (örneğin,sed ) ve her şeyin yolunda gitmesi gerekir.

Bir kullanım örneği:

$ 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

Yaşasın, şimdi bir şeyler kurabilir ve bunları yeni konumlandırılmış sanal ortamınıza yükleyebilirsiniz.


//, Hm. Bu aslında bunları yeniden yerleştirilebilir hale getirmiyor gibi görünüyor. Sürekli "normal" betik dosyaları olmadıklarına dair bazı hatalar alıyorum.
Nathan Basanese

7
"- relocatable seçeneğinin şu anda bir takım sorunları var ve her koşulda çalışacağı garanti edilmiyor. Bu seçeneğin, virtualenv'in gelecekteki bir sürümünde kullanımdan kaldırılması mümkündür. " (Vurgu benim) kullanıcı kılavuzuna bakın
BobTuckerman

1
Bunu pencerelerde denedim ve hata dizindeki tüm komut dosyalarını (* .py, * .bat, * .ps1) listeler (on * nix'e Scriptseşdeğer bin) ve activate.ps1 cannot be made relative (it's not a normal script that starts with #!c:\..python.exe.temelde dosyadaki hash-bang'den şikayet ediyor gibi bir şey söylüyor üstbilgi şu anki virtualenv'in python.exe dosyası değil, onu taşıdığım-kolay düzeltildi. O lüks senaryoya baktım ve zaten kendi yolunu keşfediyor - güzel. Diğer betiklerin bazıları da yollara dayanmaz (örn. Deactivate.bat), kısacası bu işe yarar.
Davos

2
@NathanBasanese mesaj activate.ps1 cannot be made relativegöz ardı edilebilir çünkü bu script zaten görecelidir. Komut dosyaları #!, kabuğa onu hangi uygulamanın çalıştırması gerektiğini söylemek için Linux'ta olduğu gibi yönergeleri kullanmadığından, Windows'da bu mesaj yararlı değildir . activate.batModifiye almaz, ancak (çağırarak, en azından pencere 10 kullanılmaz activatedolayısıyla ben düzenlemek için herhangi bir komut dosyalarını gerek yoktu başlattı lüks komut dosyası). Sorun, pip.exepython'a sabit kodlanmış bir yolun olması ve bir hex-editörü ile düzenleme veya sadece yeniden yükleme gerektirmesidir.
Davos

3
@Sgedda Geriye dönüp baktığımda bunu yapma derdim. Python ortamlarınız, minimum pip freezedüzeyde bir gereksinim dosyası kullanılarak kolayca yeniden oluşturulabilir olmalıdır, böylece tüm paketlerinizi, docker'ınızı (üzerinde virtualenv yüklü olarak çalışır), conda, pyenv veya diğer bazı araçları kolayca yeniden yükleyebilirsiniz. Ortamları değişmez altyapı olarak yaratabilmeli ve yok edebilmelisiniz, bunlar değerli olmamalı.
Davos

19

Python 3.3+ için (yeni venvyerleşik modülle)

Kısa Cevap (versiyondan bağımsız olarak):

  • Sanal bir ortamı taşımanın temiz ve doğrudan bir yolu yoktur
  • Sadece yeniden yaratın, çok kolay !!


Uzun cevap:

Python v3.3'ten itibaren, virtualenvadında yerleşik bir modül haline geldi venv.

--relocatableDiğer yanıtlar sözü seçenek dahil edilmemiştir venvve şu anda hiçbir iyi, ben de yeniden adlandırma farkındayım veya bir Python sanal ortam taşınmaya bu güvenli yolu yoktur.

Bununla birlikte, mevcut tüm yüklü paketleriyle sanal bir ortamı yeniden oluşturmanın oldukça basit bir yolu vardır. Sanal bir ortamı yeniden oluşturma hakkında bilgi için bu yanıta bakın veya aşağıdaki bölüme bakın. Süreç boyunca yeni ortamı istediğiniz yerde ve istediğiniz isimle yeniden oluşturabilirsiniz. Veya işlem için aşağıdaki bölüme bakın.

Bu yanıtta, doğrudan yeniden adlandırmaları veya hareketleri destekleyebilecek birkaç başka üçüncü taraf paketinden bahsediyor. Bir sanal ortamı bozulmadan taşımak için bir yol bulmaya karar verirseniz, bunların da işe yarayıp yaramadığını araştırabilirsiniz venv.

Not: Bu cevapta odaklanmak virtualenvyerine üzerinde durulmaktadır venv. Nasıl çevireceğinizi öğrenmek için aşağıya bakın.



venveski virtualenvkomut sözdizimine kıyasla

Kullanılacak komut venvşudur:

python -m venv

virtualenvorijinal pakette bir komut olarak yüklenmek yerine . "Python", python çalıştırılabilir dosyanızı nasıl çalıştırdığınızı ifade eder ve aşağıdakiler gibi çeşitli şeyler olabilir:

  1. python
  2. pyveya py -3.7benzeri ( Python 3.3+ için Windows ve şu anda yalnızca Windows için Python Launcher )
  3. python3 (python 2 ve 3'ü ikili olarak yükleyen linux ortamları için düzen)
  4. Sorun yaşıyorsanız, çalıştırmak istediğiniz python yürütülebilir dosyasının mutlak yolunu kullanın: örn. c:\program files\python37\python.exe

Hangi sürümün çalıştırıldığından emin değilseniz, her zaman python --versionöğrenebilirsiniz.



Sanal bir ortam nasıl yeniden oluşturulur

Sanal bir ortam yaratmak / yeniden yaratmak kolaydır ve onlarla biraz çalıştıktan sonra ikinci doğa haline gelmelidir. Bu işlem, ilk yarıda betiğinizi bir paket olarak (bağımlılıkları ile birlikte) dağıtmak için ne yapacağınızı ve daha sonra daha fazla geliştirme için betiğinizi / paketinizi yüklemek için birinin ne yapacağını yansıtır.

İlk olarak, sanal ortamdakilerin güncellenmiş bir listesini alın. Etkin durumdayken, kullandığı Python sürümünü alın ve bağımlılıklar listesini bir dosyaya kaydedin.

  1. python --versionHangi Python sürümünü kullandığını görmek için etkinleştirilen sanal ortamla kullanın .

    • Bu, açıklık sağlamak içindir - çeşitli nedenlerle Python sürümünü güncellemek isteyebilirsiniz - en azından en son yama sürümüne
    • Örneğin, mevcut venv Python v3.7.4 kullanıyorsa, ancak şimdi v3.7.6 kullanım dışı ise - bunun yerine yalnızca kesintisiz güvenlik ve hata düzeltmelerini içermesi gereken v3.7.6'yı kullanın.
  2. Kullanım python -m pip freeze > requirements.txtakım paket bağımlılıkları listesini oluşturmak ve içine koydu requirements.txtdosyası. Bu komut, Linux veya Git Bash'de kesinlikle çalışır - Windows'taki Powershell veya Komut Satırı hakkında% 100 emin değil.

Şimdi yeni bir sanal ortam oluşturun ve ardından bağımlılıkları eskisinden ekleyin.

  1. Yeni venv'inizi yapın.

    • Venv'e yüklemek istediğiniz doğru python sürümünü kullandığınızdan emin olun.
    • Tam olarak aynı Python sürümü olmasını istiyorsanız:
      • Python'u doğrudan mevcut sanal ortamdan çalıştırın (etkinleştirildiğinde) ve yalnızca pythonkomut olarak kullanın
      • Veya python.exesanal ortam klasöründe ile mutlak bir yol kullanın
    • Komuttaki yeni venv klasörü girişi için:
      • İstenen son klasör konumuna mutlak veya göreceli bir yol ekleyin.
      • python -m venv my_new_venvGeçerli çalışma dizininde yeni bir my_new_venvklasörde yeni bir sanal ortam oluşturmak için kullanın .
      • Venv klasörünün adı, venv'in adı olacaktır (etkinleştirildiğinde istemde görünen şey).
  2. Bağımlılıklarınızı requirements.txtdosyadan yükleyin .

    • python -m pip install -r requirements.txt

Geliştirme modunda olan yerel paketleri yeniden yüklemeniz gerekebilir.

Bir paketin kurulu olduğu belirli konumu görmeniz gerekirse şunu kullanın:

  • python -m pip list -v
  • -vVeya "Ayrıntılı" seçeneği, yüklü yolu da dahil olmak üzere yüklü her paket, hakkında bazı ilave bilgiler ekleyecektir. Bu düz emin tutuyor sanal kullanıcı ve sistem yüklü paketleri yapmak yararlıdır.

Bu noktada eski venv klasörünü ve tüm içeriğini silebilirsiniz. Bunun için bir GUI kullanmanızı tavsiye ederim - dosya silme işlemleri genellikle linux komut satırından kalıcıdır ve küçük bir yazım hatası kötü haber olabilir.


Venv pip durumunu, yani tüm kitaplıkları pip ile yeniden indirmek zorunda kalmadan kopyalamanın bir yolu yok mu?
Aydo

Bunu yapmak isteyeceğiniz nedenin ne olduğundan emin değilim - bunun nedeni internetin aşırı derecede düşük bant genişliği durumu mu yoksa çok fazla kopyalama ihtiyacı mı var? Tüm fermuarları pypi'den alıp yerel olarak kurabileceğinize inanıyorum, ancak bu konuda yeterince hızlı değilim. Paketleri barındırmak için yerel bir pip sunucusu kurabileceğinizi biliyorum.
LightCC

Çözmeye çalıştığım problem, ağ trafiğinin pip yapmasına izin vermeyen bir makinede (veya hemen hemen her yerde) bir python betiği çalıştırmak istememdir. Üzerine dosya koyabilirim ama Pip ile konuşamaz. Kesinlikle niş bir durum ama tam olarak neden bu şeyleri taşımam gerekiyor.
Richard Rast

@RichardRast Bu farklı bir sorun, sadece orijinal soruyu yanıtlıyorum. Not: Sorununuza çözümler vardır (paketleri zip olarak indirin ve yerel olarak kurun, güvenlik duvarınızın arkasında bir PyPi yansıtma sunucusu çalıştırın, vb.), Ancak bu doğru değil: Bunun için Soru-Cevap ..
LightCC

2
pip wheel . -w wheelspip install --no-index --find-links /path/to/wheels/ -r requirements.txt
İle

7

--relocatableArgüman virtualenvgörünmeden bunu yapmak izin vermek.


//, Bu sadece göreli yollara mı dayanıyor, yoksa bir şekilde başka türlü anlaşılıyor mu?
Nathan Basanese

1
- relocatable yalnızca mevcut sanal ortamlarda çalışır. virtualenv --relocatable my-python-venvOrtam zaten var olduktan SONRA çalıştırın .
hilcharge

1
Gönderen --help: This fixes up scripts and makes all .pth files relative. Hayır, platformdan bağımsız kütüphaneler yapmayacak. Farklı bir platforma taşımak istiyorsanız, yerel python'a göre yeniden yüklemeniz gerekir.
hilcharge

5
python3 venv modülü bu bayrağı desteklemiyor
Nelson

7

AMA ALAS:

Hayır, basitçe yapamazsınız mv. Geçici çözümler var, ancak yeniden yüklemek daha kolay olabilir.

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

... enterhayal kırıklığı içinde çok baskı yapıyor ve aşağıdaki işler

$
$
$ pip3 search foaas

Bunun dışında my-python-venv, ergo üzüntüsü.

İster mvSİZİN virtualenvaksi değiştirilmemiş, ve kullanmak?

Kısa cevap:

Boromir'in bunu söylemesine izin vereceğim, böylece netleştirebilsin:

Eh, ya olamaz .


2
Kanlı olmak ve onu uygun şekilde değiştirmek istemediğiniz sürece: Hareket sorununa neden olan, bölmedeki ikili dosyalar içindeki bağlantılardır. Nereden geldiğinizi biliyorsanız find bin -type f -exec ex -sc "%s,${FROM},${PWD},g|x" {} \;, bin ve lib'inizin mevcut venv klasörünüzde olduğunu varsaymak gibi bir şey kullanabilirsiniz . Bunu python3 sanal ortamlarını çok sayıda pip paketi kurulu olarak kopyalamanın ve taşımanın hızlı ve kirli bir yolu olarak kullanıyorum.
Paul Whipp

1
@PaulWhipp Bu komutu kullanmak yerine kullanmanın bir faydası var mı --relocatable? Ayrıca Nathan, harika soru ama bu korkunç bir cevap. Kendi cevabınızı kabul etmek, iyi yazılmadıkça ve seçenekleri açıkça sıralamadığı sürece, ancak yine de kendinizin öznel olacağına karar vermek her zaman biraz önyargılıdır.
Davos

1
@Davos - relocatable benim için işe yaramadı ancak python3 venv'leri ikili dosyaları hackleyerek düzenli olarak hareket ettiriyorum ve şimdiye kadar herhangi bir sorun yaşamadım.
Paul Whipp

1
Kabul edilen başka bir cevaba (yani sizin değil) değişmeniz gerektiğini ima etmiştim Belki de insanlar tarafından seçilen cevap: D
Davos

3
Soru "basitçe mvbir venv yapabilir miyim ?" İdi ve yanıt "hayır basitçe yapamazsınız mv, geçici çözümler var, ancak yeniden yüklemek daha kolay olabilir". Bu en iyi cevap olsaydı, bana ve diğerlerine biraz zaman kazandırırdı.
Nickolay

5

Evet, eğer virtualenv'in mevcut dizinine bağlı bir şey yapmadıysanız bu mümkün olmalıdır.

Ancak, seçeneğiniz varsa, yapılacak en iyi şey, yeni virtualenv oluşturmak ve bunun yerine yeni virtualenv'i kullanmaya başlamaktır. Bu en güvenli seçenektir ve daha sonra sorunlara neden olması en az olasıdır.

Belgeler şunlardan bahsetmektedir :

Her virtualenv, içine sabit kodlanmış yol bilgisine sahiptir,

Örneğin, çalıştırdıysanız, çalıştırdıktan setvirtualenvprojectsonra doğru dizine workon ...geçemez, bu durumda bunu manuel olarak düzeltmeniz gerekir.

Genel olarak bir virtualenv, gerekli Python yorumlayıcı dosyalarına ve ihtiyacınız olan paketlere sahip bir dizinden biraz daha fazlasıdır.


3

Bunun ve benzer konuyla ilgili diğer konuların cevaplarını kullanarak , virtualenv dizininin içinde bulunan ve çalıştırılan bir bash betiği yaptım. , virtualenv hareketlerinize yardımcı olacak .

Bunu yaptıktan sonra , dizini her taşıdığınızda değişkeninizi virtualenv --relocatable yourenvdeğiştirmeniz gerekecek VIRTUAL_ENV, bu yüzden manuel olarak değiştirmek istemiyorsanız, bunu kullanın.

#!/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

Umut ediyorum bu yardım eder.


1

EVET YAPABİLİRSİN! (Giriş windows)

Çözüm kolaydır, sanal ortamınızı herhangi bir yere taşıyın ve ardından activate.batiçinde düzenleyin scripts\:

  1. Sanal ortama istediğiniz dizine gidin

  2. Sağ tıklayın ve konumunda activate.batbulunan düzenleme venv_folder\scripts.

  3. VIRTUAL_ENVDeğişkeni şundan değiştir :

     set VIRTUAL_ENV=C:\old_directory\venv_name
    

    içine

     set VIRTUAL_ENV=C:\new_directory\venv_name
    
  4. Düzenlenen toplu iş dosyasını kaydedin ve işte bu kadar!

NOT: Çözümüm işe windows usersyaramalı ve yeni sanal ortamlar kurmayı kaydetmeli , bunun başka işletim sistemlerinde çalışacağından şüpheliyim .bat.MS-DOS


1
Değişim old_directoryiçinold_directory - bir yazım hatası bu?
ack
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.