Bir sanal ortamda python'u yükseltin


206

Virtualenv'de kullanılan python sürümünü yükseltmenin bir yolu var mı (örn. Bir hata düzeltme sürümü çıkarsa)?

Daha pip freeze --local > requirements.txtsonra dizini kaldırabilirim ve pip install -r requirements.txt, ancak bu, büyük kütüphanelerin yeniden yüklenmesini gerektirir, örneğin, numpyçok kullandığım.

Bunun, örneğin 2.6 -> 2.7'den yükseltme yaparken bir avantaj olduğunu görebilirim, ama 2.7.x -> 2.7.y hakkında ne dersiniz?


2
Çalıştırmak için bazı yolları vb. Değiştirebilirsiniz. İstediğiniz son şey üretimden biraz farklı bir ortam. Sadece düşünün .. Eğer çeşitli sürümlerin nasıl derlendiği arasında bir fark varsa, hatayı izleyerek kaydedilen her zaman kaybedersiniz. Yepyeni bir sanal tasarım oluşturmak ve her şeyi yeniden yüklemek için zaman ayırırım.
Sam Dolan

@Simon Walker. Tamamen aynı sorun. Bir hata düzeltmesi için python 3.5.3 yükseltmek zorunda.
Mohammed Shareef C

Yanıtlar:


78

Gördüğünüz mü bu ? Bu yanıtı yanlış anlamadıysam, eski yanıtın üstünde yeni bir sanal reklam oluşturmayı deneyebilirsiniz. Sadece hangi python'un virtualenv'inizi kullanacağını bilmeniz gerekir (virtualenv sürümünüzü görmeniz gerekir).

Senin Virtualenv eskisinin aynı piton sürümü ile birlikte yüklenir ve Virtualenv paketi yükseltme bir seçenek değildir ise, okumak isteyebilirsiniz , bu istediğiniz piton sürümü ile bir VIRTUALENV yüklemek için.

DÜZENLE

Bu yaklaşımı test ettim (eskisinin üzerine yeni bir virtualenv yaratan) ve benim için iyi çalıştı. Python 2.6'dan 2.7'ye veya 2.7'den 2.7'ye 3.x'e değiştirirseniz bazı sorunlarınız olabileceğini düşünüyorum, ancak sadece aynı sürümde yükseltirseniz (istediğiniz gibi 2.7'de kalıyorsanız), tüm paketler gibi herhangi bir sorun yaşamamalısınız. her iki python sürümü için aynı klasörlerde tutulur (2.7.x ve 2.7.y paketleri sizin_env / lib / python2.7 / içinde bulunur).

Virtualenv python sürümünüzü değiştirirseniz, o sürüm için tüm paketlerinizi tekrar yüklemeniz gerekir (veya ihtiyacınız olan paketleri yeni sürüm paketleri klasörüne, yani :_env / lib / python_newversion / site-paketleri) bağlamanız gerekir.


14
Özellikle mümkünse herhangi bir paketi yeniden yüklemek istemedi. Açıkçası niçin önemli olduğunu bilmiyorsanız kaynaktan numpy kurmadınız;) ipucu: LOOOOOOOOOOOOOONG zaman alır.
Antti Haapala

evet, anlıyorum. Ama öyle görünüyor ki, eğer diğerinin üstünde bir sanal reklam yaparsa, paketler kaybolmaz, bu nedenle numpy'yi veya başka bir paketi tekrar yüklemek zorunda kalmaz. Yine de, başarısız olması durumunda bunu yeni bir virtualenv'de denemesi gerektiğini düşünüyorum.
marianobianchi

Benim durumumda dinleniyorum, yeni sanalenv sürümlerinin gerçekten de yükseltildiğine inanıyorum, ancak eski sürümler için, en az bir python hata düzeltme sürümüyle ilgili sorunlara neden olan python yürütülebilir dosyasının üzerine bile yazmadılar.
Antti Haapala

4
Benim için işe yaramadı ve öyle görünmüyor gibi görünüyor: github.com/pypa/virtualenv/issues/437
Kentzo

1
Eskisinin üzerine yeni bir tane yaratmaya çalıştım virtualenvve işe yaradı . Ben belirtmek zorunda mıydın -ppiton doğru sürümüne işaret etmek.
osa

76

Python 3.3+ ile gelen venv modülünü kullanıyorsanız, bir --upgradeseçeneği destekler . Başına docs :

Python'un yerinde yükseltildiğini varsayarak, ortam dizinini Python'un bu sürümünü kullanacak şekilde yükseltin

python3 -m venv --upgrade ENV_DIR

1
Ne yazık ki, bu kırdı venvve "sadece virtualenv kullanabilirsiniz" temelinde düzeltmeyi reddetti Ubuntu 16.04 üzerinde çalışmaz . EDIT: aslında, işe yarıyor! Ayrıca "ensurepip" ile ilgili bir hata mesajı gösterir.
rspeer

2
Sistemimde python'u 3.5.1'den 3.6.4'e yükselttim. Ve python3.6 -m venv --upgrade <path_of_existing_env>
sanal bilgisayarımda python'u

1
Benim durumumda bin/pythonve bin/python3hala eski python3.4ikili ile bağlantılı ve ben bağlantıları manuel olarak ayarlamak zorunda kaldı. Ayrıca, şimdi eski python sürümünü kaldırmanın bir yolu var mı?
Jens

4
Elimde Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.> ne anlama geliyor? Aktif bir python işlemi göremiyorum, yükseltme yapamıyorum.
user305883

1
@ user305883 Sistem Python sürümümü 3.5'ten 3.6'ya yükselttikten sonra (ve 3.5'i kaldırdıktan sonra) benzer bir hatayla karşılaştım. 3.5'i yeniden yüklemek ve çalışması python3.6 -m venv --upgrade ENV_DIRiçin koşmak zorunda kaldım . Sanırım hala bazı sembolik bağlantıları güncellemem gerekecek ENV_DIR/bin. Bu nedenle, hile eski sürüm kurulurken yeni Python sürümüyle güncellenecekti .
AstroFloyd

24

Tekrar güncellendi: Aşağıdaki yöntem, virtualenv'in yeni sürümlerinde çalışmayabilir. Eski sanal ağda değişiklik yapmaya çalışmadan önce, bağımlılıkları bir gereksinim dosyasına (pip freeze > requirements.txt)kaydetmeli vebaşka bir yerde yedeklemelisiniz. Bir şeyler ters giderse, yine de yeni bir virtualenv oluşturabilir ve eski bağımlılıkları içine yükleyebilirsiniz (pip install -r requirements.txt).

Güncelleme: Cevabı başlangıçta cevapladıktan 5 ay sonra değiştirdim. Aşağıdaki yöntem daha kullanışlı ve sağlamdır.

Yan etki: Python'u v2.7.8'e yükselttikten sonra sanal bir ortamdaSymbol not found: _SSLv2_methodyaptığınız zamandaistisnayıimport ssldüzeltir.

Uyarı: Şu anda bu yalnızca Python 2.7.x içindir .


OS X'te Homebrew Python kullanıyorsanız, önce deactivatetüm sanal varlıklar, sonra Python'u yükseltin:

brew update && brew upgrade python

Aşağıdaki komutları çalıştırın ( <EXISTING_ENV_PATH>sanal ortamınızın yoludur):

cd <EXISTING_ENV_PATH>
rm .Python
rm bin/pip{,2,2.7}
rm bin/python{,2,2.7}
rm -r include/python2.7
rm lib/python2.7/*
rm -r lib/python2.7/distutils
rm lib/python2.7/site-packages/easy_install.*
rm -r lib/python2.7/site-packages/pip
rm -r lib/python2.7/site-packages/pip-*.dist-info
rm -r lib/python2.7/site-packages/setuptools
rm -r lib/python2.7/site-packages/setuptools-*.dist-info

Son olarak, sanal ortamınızı yeniden oluşturun:

virtualenv <EXISTING_ENV_PATH>

Bu şekilde, eski Python çekirdek dosyaları ve standart kitaplıklar (artı setuptoolsve pip) kaldırılırken, yüklenen özel kitaplıklar site-packagessaf Python'da olur olmaz korunur ve çalışır. İkili kitaplıkların düzgün çalışması için yeniden yüklenmesi gerekebilir veya gerekmeyebilir.

Bu benim için Django yüklü 5 sanal ortamda çalıştı.

BTW, ./manage.py compilemessagesdaha sonra çalışmıyorsa, şunu deneyin:

brew install gettext && brew link gettext --force

Silmek zorunda olduğum tek dosya bin/pythondosyaydı.
Koen.

Bazı eski Python sürümleri için silme setuptoolsve pipgereklidir.
Rockallite

1
Ayrıca <EXISTING_ENV_PATH>/.Pythonsanalenv yaratılışını sildiğim için de silmek zorunda kaldım .
Kiran Jonnalagadda

2
Bu cevaba dayanarak küçük bir senaryo yazdım (tam atıfla): burgundywall.com/post/update-all-python-virtual-environments
Kurt

Aslında sanal ortamınızı çalıştırarak kolayca kaldırabilir rmvirtualenv <env_name>ve tüm bağımlı bağımlılıklarını kaldırabilirsiniz :) Daha fazla bilgi için: virtualenvwrapper.readthedocs.io/en/latest/…
Nick Lucas

7

Eskisinin üstünde yeni bir sanal reklam yaratamadım. Ancak pip'te, gereksinimleri yepyeni bir venv'e yeniden yüklemeyi çok daha hızlı hale getiren araçlar var. Pip, gereksinimleri.txt dosyasındaki öğelerin her birini bir tekerlek paketine oluşturabilir ve bunu yerel bir önbellekte saklayabilir. Yeni bir ven oluşturduğunuzda ve pip kurulumunu çalıştırdığınızda, pip, bulursa otomatik olarak önceden oluşturulmuş tekerlekleri kullanacaktır. Tekerlekler, her modül için setup.py çalıştırmasından çok daha hızlı kurulur.

~ / .Pip / pip.conf dosyam şöyle görünüyor:

[global]
download-cache = /Users/me/.pip/download-cache
find-links =
/Users/me/.pip/wheels/

[wheel]
wheel-dir = /Users/me/.pip/wheels

Tekerlek ( pip install wheel) takıp çalıştırıyorum pip wheel -r requirements.txt. Bu, inşa edilmiş tekerlekleri pip.conf'umdaki tekerlek yönüne kaydeder.

O andan itibaren, bu gereksinimlerden herhangi birini kurduğumda, onları tekerleklerden takar, bu da oldukça hızlıdır.


1
Çoğu insan için, işi yapmak için pip makineleri kullanmak mantıklı, ancak sanalenv'lerini postactivate, predeactivate, vb.
dpwrussell

6

Mevcut bir virtualenvwrapper projesi için Python sürümünü yükseltme ve aynı adı koruma

Özellikle mevcut cevaplar benim için yapmadığı için Doug Hellmann'ın mükemmel sanal genvwrapper'ını kullanan herkes için bir cevap ekliyorum .

Bazı bağlamlar:

  • Python 2 ve Python 3 gibi bazı projeler üzerinde çalışıyorum; kullanmak isterdim python3 -m venv, Python 2 ortamlarını desteklemiyor
  • Yeni bir proje başlattığımda mkproject, sanal ortamı yaratan, boş bir proje dizini yaratan ve içine cd'ler içeren bir proje kullanıyorum.
  • workonPython sürümü ne olursa olsun herhangi bir projeyi etkinleştirmek için virtualenvwrapper komutunu kullanmaya devam etmek istiyorum

Talimatlar:

Mevcut projenizin adlandırıldığını foove şu anda Python 2 ( mkproject -p python2 foo) çalıştırdığını varsayalım , ancak komutlar 2.x'ten 3.x'e, 3.6.0'dan 3.6.1'e yükseltme, vb. şu anda etkinleştirilmiş sanal ortamın içindedir.

1. Eski sanal ortamı devre dışı bırakın ve kaldırın:

$ deactivate
$ rmvirtualenv foo

Kancalara herhangi bir özel komut eklediyseniz (örn. bin/postactivate), Ortamı kaldırmadan önce bunları kaydetmeniz gerektiğini unutmayın.

2. Gerçek projeyi geçici bir dizinde saklayın:

$ cd ..
$ mv foo foo-tmp

3. Yeni sanal ortamı (ve proje dizinini) oluşturun ve etkinleştirin:

$ mkproject -p python3 foo

4. Oluşturulan boş proje dizinini gerçek proje ile değiştirin, proje dizinine geri dönün:

$ cd ..
$ mv -f foo-tmp foo
$ cdproject

5. Bağımlılıkları yeniden yükleyin, yeni Python sürümünü onaylayın, vb:

$ pip install -r requirements.txt
$ python --version

Bu yaygın bir kullanım durumuysa, virtualenvwrapper'a $ upgradevirtualenv/ gibi bir şey eklemek için bir PR açmayı düşüneceğim $ upgradeproject.


1
Evet lütfen. Bunu yarıya
indirdim

2

Bu yaklaşım benim için her zaman işe yarar:

# First of all, delete all broken links. Replace  my_project_name` to your virtual env name
find ~/.virtualenvs/my_project_name/ -type l -delete
# Then create new links to the current Python version
virtualenv ~/.virtualenvs/my_project_name/
# It's it. Just repeat for each virtualenv located in ~/.virtualenvs

Den alınan:


2

Adım 1: Donma gereksinimi ve mevcut ortamın yedeğini alma

pip freeze > requirements.txt
deactivate
mv env env_old

Adım 2: Python 3.7'yi yükleyin ve virütal ortamı etkinleştirin

sudo apt-get install python3.7-venv
python3.7 -m venv env
source env/bin/activate
python --version

3. Adım: Yükleme gereksinimleri

sudo apt-get install python3.7-dev
pip3 install -r requirements.txt

1

Ana dizini bir mac'tan diğerine (Mountain Lion'dan Yosemite'ye) taşıdım ve eski dizüstü bilgisayarını kaybedene kadar kırık sanal ekrandan haberdar değildim. Virtualenv'in Python 2.7 tarafından yüklendiğini belirttim brewve Yosemite Python 2.7 ile birlikte geldiğinden, virtualenvimi sistem pythonuna güncellemek istedim. virtualenvVarolan dizinin en üstünde koştuğumda OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'hata alıyordum . Deneme yanılma yoluyla, birkaç bağlantıyı kaldırarak ve birkaç tane daha manuel olarak düzelterek bu soruna geçici bir çözüm buldum. Bu nihayet yaptım (@Rockalite ne yaptığını benzer, ancak daha basit):

cd <virtualenv-root>
rm lib/python2.7/config
rm lib/python2.7/lib-dynload
rm include/python2.7
rm .Python
cd lib/python2.7
gfind . -type l -xtype l | while read f; do ln -s -f /System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/${f#./} $f; done

Bundan sonra, varolan dizinin üstünde virtualenv çalıştırabildim.


1

Python3'ü yüklemek ve yükseltmek için Homebrew kullanan OS X veya macOS'ta daha önce python -m venv --upgrade ENV_DIRişe yarayacak sembolik bağlantıları silmek zorunda kaldım .

Ben şimdi tekrar yapmak gerektiğinde nasıl aylar hatırlıyorum bu yüzden upgrade_python3.sh kaydedildi:

brew upgrade python3
find ~/.virtualenvs/ -type l -delete
find ~/.virtualenvs/ -type d -mindepth 1 -maxdepth 1 -exec python3 -m venv --upgrade "{}" \;

GÜNCELLEME: Bu ilk başta iyi çalışıyor gibi görünse de, py.test'i çalıştırdığımda bir hata verdi. Sonunda bir gereksinimler dosyasından ortamı yeniden oluşturdum.


py.test`/ .virtualenvs / myenv / bin / python3.7 bir sembolik bağlantı olmadığından çalışmaz, bu nedenle güncellenmez.
Ash Berlin-Taylor

Ah, sorun şu ~/.virtualenvs/myenv/.Pythonki bir sembolik olan.
Ash Berlin-Taylor

1

Kullanıyorsanız pipenv, bir ortamı yerinde yükseltmenin mümkün olup olmadığını bilmiyorum, ancak en azından küçük sürüm yükseltmeleri için, yeni bir ortam oluştururken paketleri sıfırdan yeniden oluşturmayacak kadar akıllı görünüyor. Örneğin, 3.6.4 ila 3.6.5 arası:

$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a v$ pipenv --python 3.6.5 install
Virtualenv already exists!
Removing existing virtualenv
Creating a virtualenv for this project
Using /usr/local/bin/python3.6m (3.6.5) to create virtualenv
Running virtualenv with interpreter /usr/local/bin/python3.6m
Using base prefix '/usr/local/Cellar/python/3.6.5/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python3.6
Also creating executable in /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/python
Installing setuptools, pip, wheel...done.

Virtualenv location: /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD
Installing dependencies from Pipfile.lock (84dd0e)…
  🐍   ▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉▉ 47/47  00:00:24
To activate this project's virtualenv, run the following:
 $ pipenv shell
$ pipenv shell
Spawning environment shell (/bin/bash). Use 'exit' to leave.
. /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
bash-3.2$ . /Users/dmoles/.local/share/virtualenvs/autoscale-aBUhewiD/bin/activate
(autoscale-aBUhewiD) bash-3.2$ python
Python 3.6.5 (default, Mar 30 2018, 06:41:53) 
[GCC 4.2.1 Compatible Apple LLVM 9.0.0 (clang-900.0.39.2)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy as np
>>>

müthiş! Bu mücevher için teşekkürler
Mayur Patil

1

Sadece açıklığa kavuşturmak istiyorum, çünkü bazı cevaplar, bazıları cevap venvveriyor virtualenv.

Kullanımı -pveya --pythonbayrağına desteklenir virtualenv, ancak üzerinde venv. Birden fazla Python sürümünüz varsa ve hangisini oluşturacağınızı belirtmek istiyorsanız venv, bunu komut satırında şu şekilde yapın:

malikarumi@Tetuoan2:~/Projects$ python3.6 -m venv {path to pre-existing dir you want venv in}

Tabii ki venvdiğerlerinin işaret ettiği gibi yükseltebilirsiniz , ancak bu venv, ilk önce bunu oluşturmak için kullanılan Python'u zaten yükselttiğinizi varsayar . Sisteminizde bir yerde olmayan bir Python sürümüne yükseltemezsiniz, bu yüzden önce istediğiniz sürümü aldığınızdan emin olun, sonra istediğiniz tüm vidyoları yapın.


0

Sorunu olan herkes için

Hata: '[' / Kullanıcılar / ben / Siteler / site / venv3 / bin / python3 ',' -Im ',' ensurepip ',' --upgrade ',' --default-pip ']' sıfırı döndürmedi çıkış durumu 1.

Python3.6-venv yüklemeniz gerekiyor

 sudo apt-get install python3.6-venv
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.