Virtualenv klasörünü bozmadan yeniden adlandırma


162

Klasör oluşturdum ve içinde bir sanalenv örneği başlattım.

$ mkdir myproject
$ cd myproject
$ virtualenv env

Çalıştığımda (env)$ pip freeze, kurulu paketleri olması gerektiği gibi gösterir.

Şimdi adlandırmak istediğiniz myproject/için project/.

$ mv myproject/ project/

Ancak, şimdi koştuğumda

$ . env/bin/activate
(env)$ pip freeze

pip'in kurulu olmadığını söylüyor. Ortamı bozmadan proje klasörünü nasıl yeniden adlandırabilirim?


1
Bu soru eski ve zaten bir cevabı var, ama merak etmeliyim ki, OP neden sanalenv'i olduğu yere geri taşıyamadı? Açıkçası bu, hareket etme / yeniden adlandırma arzusunu çözmez, ancak çalışan bir sanal görüntüyü geri yüklemez mi yoksa zaten umutsuzca kırılır mı?
Malik

2
Evet, haklısın, sanal env'yi onardı, ancak sorunu çözmedi.
Florian

Kasım 2019, Python3. Benim için en iyi çözüm aarongorka.com/blog/portable-virtualenv
Samir Sadek

Yanıtlar:


148

Göreli yolları kullanmak için yüklemenizi ayarlamanız gerekir. seçeneği virtualenvile bunu sağlar --relocatable. Gönderen docs :

Normalde ortamlar belirli bir yola bağlıdır. Bu, bir ortamı hareket ettiremeyeceğiniz veya başka bir bilgisayara kopyalayamayacağınız anlamına gelir. Bir ortamı komutla yeniden konumlandırılabilir hale getirmek için düzeltebilirsiniz:

$ virtualenv --relocatable ENV

NOT: ENV, sanal ortamın adıdır ve bunu ENV dizininin dışından çalıştırmanız gerekir.

Bu, setuptools tarafından oluşturulan veya dağıtılan dosyaların bazılarının göreli yolları kullanmasını sağlar ve ortamı seçmek için Python yorumlayıcısının konumunu kullanmak yerine tüm komut dosyalarını activ_this.py kullanacak şekilde değiştirir.

Not: Ortama herhangi bir paket yükledikten sonra bunu çalıştırmanız gerekir. Bir ortamı yeniden taşınabilir hale getirirseniz, yeni bir paket yüklerseniz, virtualenv --relocatable'ı yeniden çalıştırmanız gerekir.


2
uyarı: Bir env'nin yerini değiştirilebilir olarak değiştirmek, klasörü taşımanıza izin vermekten daha fazlasını yapar. ( Not: dokümanlardan kopyalanmıştır) ... yan etkileri olabilir.
Ben Roberts

7
--Relocatable seçeneğinin şu anda bir dizi sorunu vardır ve her koşulda çalışacağı garanti edilmez. Bu seçeneğin ilerideki bir Virtualenv sürümünde kullanımdan kaldırılması mümkündür. Ayrıca, bu, paketlerinizi çapraz platform yapmaz. Dizini hareket ettirebilirsiniz, ancak yalnızca diğer benzer bilgisayarlarda kullanılabilir.
Demz

1
@TheDemz grep -EIr '\Wold_venv_name\W' /path/to/new_venveski venv kullanan herhangi bir shabang bulmanıza yardımcı olacaktır, ancak taşınan venv'in tam bir doğrulaması değildir.
ocaklar

2
Ayrıca, .projectvirutalenvwrapper kullandığınızı ve proje dizinini yeni virtualenv ile eşleşecek şekilde yeniden adlandırdığınızı varsayarak, sanalenv'e bağlı kaynak kodunun yolunu içeren virtualenvwrapper dosyasını düzenlemeniz gerekir.
ocaklar

Bunu çalıştırmadan önce virtualenv'i devre dışı bırakmak zorunda kaldım.
antonagestam

108

"Nedenini bilmek" in "nasıl olduğunu bilmek" ten daha önemli olduğuna inanıyorum . İşte, bunu düzeltmek için başka bir yaklaşım.

Çalıştırdığınızda . env/bin/activate, aslında aşağıdaki komutları yürütür ( /tmpörneğin):

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

Ancak, sadece yeniden adlandırmış myprojectiçin projectbu komut yürütmek için başarısız yüzden. Bu yüzden diyor ki pip is not installed, pipsistem küresel ortamına yüklemediniz ve virtualenv'iniz pipdoğru şekilde kaynaklanmamış.

Bunu manuel olarak düzeltmek istiyorsanız, yol şu şekildedir:

  1. Vim gibi favori düzenleyicinizle, /tmp/project/env/bin/activategenellikle 42. satırda değiştirin :

    VIRTUAL_ENV='/tmp/myproject/env' => VIRTUAL_ENV='/tmp/project/env'

  2. Değiştirme /tmp/project/env/bin/pipdoğrultusunda, 1:

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

Bundan sonra sanal ortamınızı envtekrar etkinleştirin ve tekrar pipgeri geldiğini göreceksiniz .


6
Yolların manuel olarak değiştirilmesi isteniyorsa, ikiden fazla sabit kodlu dosyanın olduğu belirtilmelidir. Gibi bir şeyle hepsini bulun: grep -iHnR venv-name /path/to/venv-name | grep -v "^Binary file" | grep -i venv-name. Aslında, Django örneklerimden birinde, paketlerin çoğunun içinde "Python sh-bang'a giden yol" olduğunu fark ettim.
Kevin

Bu bana çok yardımcı oldu. Kesinlikle nedenini bilmem gerekiyordu ... Teşekkürler!
Jarvis

Keven'in yukarıdaki yorumunun aksine, bu iki satırı düzenlemenin, hareket etme ile ilgili benim için tüm sorunları çözdüğünü görüyorum virtualenv. Belki de kullanmadığım bazı kullanım durumları vardır ve bu yüzden sorunla karşılaşmazsınız.
Deleet

Çizik! Bugün bir sorunla karşılaştım: ipython virtualenv. Bunu çözmek için, bash başlığını (buna ne denir?) Düzenledim ipythonve sonra iyi çalıştı.
Deleet

Hmm bu benim için çalışmıyor ve aktif betiğimin Adım 2'de atıfta bulunulan Satır 1'e sahip olmadığı anlaşılıyor. Bir şey değişti mi?
Evan Zamir

40

NOT: @jb olarak. Bu çözüm sadece kolayca (yeniden) oluşturulan virtualenvs için geçerlidir . Bir ortamın yüklenmesi birkaç saat sürüyorsa, bu çözüm önerilmez


Virtualenvs mükemmeldir çünkü bunlar yapmak ve dolaşmak kolaydır; sizi tek bir yapılandırmaya kilitlemenizi engeller. Proje gereksinimlerini biliyorsanız veya bunları alabiliyorsanız, Yeni yapınvirtualenv :

  • requirements.txtDosya oluştur

    (env)$ pip freeze > requirements.txt

    • requirements.txtDosyayı oluşturamıyorsanız env/lib/pythonX.X/site-packagesorijinali çıkarmadan önce kontrol edin env.
  • Mevcut olanı sil (env)

    deactivate && rm -rf env

  • Yeni bir tane oluşturun virtualenv, etkinleştirin ve gereksinimleri yükleyin

    virtualenv env && . env/bin/activate && pip install -r requirements.txt


Alternatif olarak, tüm sanal merkezler merkezi bir yerde tutulduğu için işleri biraz daha kolaylaştırmak için virtualenvwrapper kullanın

$(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
Bazı insanlar pip install -r requirements.txtiçin birkaç saat sürer (ahududu pi üzerinde üçüncü taraf C-uzantılarını derleme).
jb.

4
Belki de doğru, ama bu benim için bir uç durum gibi görünüyor. Hala bunun birçok durum için uygun bir çözüm olabileceğini düşünüyorum.
bnjmn

Yah, birçok proje (örneğin Django web sitesi), birkaç düzine bağımlılığa sahip olsalar bile, her şeyi yüklemek için sadece 30 saniye sürer (önce her şeyi indirip '--no-index --find-links = downloadDir' kullanın )
Jonathan Hartley

1
@bnjmn, tek astarı virtualenv env && pip install -r requirements.txtyeni ortama gereksinimleri yüklemez çünkü etkinleştirmezsiniz
Yarin

1
@Yarin Bunu işaret ettiğiniz için teşekkürler. Tamamen özledim, virtualenv-wrapperkendim kullanıcı olarak (otomatik olarak yaratılışta aktive olur). Cevabımı, virtualenvherhangi bir karışıklıktan kaçınmayı umarak etkinleştirmeyi içerecek şekilde güncelledim .
bnjmn

28

Her zaman yardım etmek için virtualenvwrapper'ı yüklerim. Kabuk isteminden:

pip install virtualenvwrapper

Virtualenvwrapper belgelerinde belgelenen bir yol vardır - cpvirtualenv Yaptığınız şey bu. Ortamınızın dışında ve kabuk komut istemine geri döndüğünüzden emin olun. Bunu gerekli adlarla yazın:

cpvirtualenv oldenv newenv

Ve sonra, gerekirse:

rmvirtualenv oldenv

Newenv'inize gitmek için:

workon newenv

1
Afrowave'in cevabı gerçekten kabul edilen yöntem olmalıdır.
Jaxian

Bu sadece bir kişi kullanıyorsa çalışır virtualenvwrapper, sadece değil virtualenv. @Ryankdwyer'den gelen bu cevap daha iyi.
LS

Cevabımı, 'virtualenvwrapper' yüklemesi gerektiğini yansıtacak şekilde düzenledim. Yeniden adlandırma sanal ortamlarının çok fazla olduğunu varsayarsak, bu şekilde tavsiye ederim.
Afrowave

Virtualenvwrapper'a dayanmasına rağmen, en basit olanıdır. Ve iyi çalışıyor.
blasrodri

17

Aşağıdaki adımları uygulayarak sorununuzu çözebilirsiniz:

  1. dizininizi yeniden adlandırın
  2. Bunu tekrar çalıştır: $ virtualenv ..\path\renamed_directory
  3. virtualenv, paketlerinizi yerinde bırakırken dizin ilişkilerini düzeltir
  4. $ scripts/activate
  5. $ pip freeze paketlerinizin yerinde olduğunu doğrulamak için
  6. Önemli bir uyarı, virtualenv dizininizdeki komut dosyası dosyalarında statik yol bağımlılıklarınız varsa, bunları el ile değiştirmeniz gerekecektir.

1
Bu benim için çok iyi bir çözümdü. Bu çözüm , bazı sorunlardan kaçınabileceğinden --relocatable, bu çözümün kabul edilen cevaptan daha iyi olduğunu düşünüyorum. Şimdiye kadar, birçok .pycdosyanın _new_name_/lib/python2.7hala başvurduğunu fark ettim _old_name_. Ancak bu, ortamımın çalışma şeklini etkilemiyor gibi görünüyor. Belki de daha iyi bir çözüm, virtualenvwrapperburadaki yanıtlar arasında belirtilen diğer yardımcı programları kullanmaktır . En azından bu çözüm için ek programların yüklenmesi gerekmez.
LS

Tıkır tıkır çalışıyor!
AmirHossein

13

Benim için defalarca sorunsuz çalışan bir başka yol da virtualenv-clone :

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

Bu en iyi cevap olarak işaretlenmelidir. Eller aşağı! Klonlamak biraz zaman aldı, bu yüzden sabırlı olun.
Amitrajit Bose

virtualenv-clone istemi güncellemeyi ihmal eder. Elle bunu yapmak zorunda kaldı. Bunun dışında harika.
user3667349

5

(proje klasörü içinde)

cd bin
sed -i 's/old_dir_name/new_dir_name/g' *

Devre dışı bırakmayı ve etkinleştirmeyi unutma


İyi çalışıyor; Veya Linux yolu için:sed -i "s|$old_dir|$new_dir|g" bin/*
Destroyica

sed -i '.original' 's/old_dir_name/new_dir_name/g' *mac için
Alex

1

virtualenv --relocatable ENVistenen bir çözüm değildir. Çoğu insanın herhangi bir uzun süreli yan etkisi olmadan bir virtualenv'i yeniden adlandırmak istediğini varsayıyorum .

Bu yüzden bunu yapmak için basit bir araç oluşturdum. Virtualenv-mv için proje sayfası biraz daha ayrıntılı olarak özetlemektedir, ancak aslında virtualenv-mvbasit bir uygulamasını mv(herhangi bir seçenek olmadan) kullandığınız gibi kullanabilirsiniz .

Örneğin:

virtualenv-mv myproject project

Ancak bunu az önce hacklediğimi lütfen unutmayın. Alışılmadık koşullarda (örn. Sembolik sanal sanal) bozulabilir, bu yüzden lütfen dikkatli olun (kaybetmeyi göze alamayacağınız şeyleri yedekleyin) ve herhangi bir sorunla karşılaşırsanız bana bildirin.

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.