Tingkatkan python dalam virtualenv

206

Apakah ada cara untuk memutakhirkan versi python yang digunakan dalam virtualenv (mis. Jika rilis bugfix keluar)?

Saya bisa pip freeze --local > requirements.txt, lalu menghapus direktori dan pip install -r requirements.txt, tetapi ini membutuhkan banyak instalasi ulang perpustakaan besar, misalnya numpy, yang saya gunakan banyak.

Saya dapat melihat ini adalah keuntungan ketika melakukan upgrade dari, misalnya, 2.6 -> 2.7, tetapi bagaimana dengan 2.7.x -> 2.7.y?

Simon Walker
sumber
2
Meskipun Anda mungkin dapat memodifikasi beberapa jalur, dll. Untuk membuatnya berfungsi. Hal terakhir yang Anda inginkan adalah lingkungan yang sedikit berbeda dari produksi. Coba pikirkan .. jika ada satu perbedaan antara bagaimana berbagai versi dikompilasi, Anda akan kehilangan semua waktu yang disimpan dengan melacak bug. Saya hanya meluangkan waktu untuk membuat virtualenv baru dan menginstal ulang semuanya.
Sam Dolan
@Simon Walker. Masalah yang sama persis. Saya harus memutakhirkan python 3.5.3 untuk perbaikan bug.
Mohammed Shareef C

Jawaban:

77

Apakah kamu melihat ini? ? Jika saya belum salah mengerti jawaban itu, Anda dapat mencoba membuat virtualenv baru di atas yang lama. Anda hanya perlu tahu python mana yang akan menggunakan virtualenv Anda (Anda perlu melihat versi virtualenv Anda).

Jika virtualenv Anda diinstal dengan versi python yang sama dengan yang lama dan memutakhirkan paket virtualenv Anda bukan pilihan, Anda mungkin ingin membaca ini untuk menginstal virtualenv dengan versi python yang Anda inginkan.

EDIT

Saya telah menguji pendekatan ini (yang membuat virtualenv baru di atas yang lama) dan itu berhasil dengan baik untuk saya. Saya pikir Anda mungkin memiliki beberapa masalah jika Anda mengubah dari python 2.6 ke 2.7 atau 2.7 ke 3.x tetapi jika Anda hanya memutakhirkan dalam versi yang sama (tinggal di 2.7 seperti yang Anda inginkan) Anda seharusnya tidak memiliki masalah, karena semua paket disimpan dalam folder yang sama untuk kedua versi python (paket 2.7.x dan 2.7.y ada di dalam your_env / lib / python2.7 /).

Jika Anda mengubah versi virtualenv python, Anda harus menginstal semua paket lagi untuk versi itu (atau hanya menautkan paket yang Anda butuhkan ke folder paket versi baru, yaitu: your_env / lib / python_newversion / situs-paket)

marianobianchi
sumber
13
Dia secara khusus tidak ingin menginstal ulang paket apa pun jika memungkinkan. Jelas Anda tidak pernah menginstal numpy dari sumber jika Anda tidak tahu mengapa itu penting;) petunjuk: dibutuhkan waktu LOOOOOOOOOOOOOOOONG.
Antti Haapala
ya, saya mengerti itu. Tetapi tampaknya jika dia membuat virtualenv di atas yang lain, paket tidak hilang, jadi dia tidak perlu menginstal ulang paket numpy atau lainnya. Namun demikian, saya pikir dia harus mencoba ini di virtualenv baru jika gagal.
marianobianchi
Saya mengistirahatkan kasus saya, saya percaya bahwa versi virtualenv baru memang upgrade di tempat, namun untuk versi lama, mereka bahkan tidak menimpa executable python, yang menyebabkan masalah dengan setidaknya satu rilis perbaikan bug python.
Antti Haapala
4
Itu tidak bekerja untuk saya dan sepertinya tidak seharusnya: github.com/pypa/virtualenv/issues/437
Kentzo
1
Saya mencoba membuat yang baru virtualenvdi atas yang lama, dan ternyata berhasil. Saya memang harus menentukan -puntuk mengarahkannya ke versi python yang tepat.
Osa
76

Jika Anda menggunakan modul venv yang dilengkapi dengan Python 3.3+, itu mendukung --upgradeopsi. Per dokumen :

Mutakhirkan direktori lingkungan untuk menggunakan versi Python ini, dengan asumsi Python telah ditingkatkan di tempat

python3 -m venv --upgrade ENV_DIR
CoupleWavyLines
sumber
1
Sayangnya, ini tidak berfungsi di Ubuntu 16.04, di mana mereka rusak venvdan menolak untuk memperbaikinya dengan dasar bahwa "Anda bisa menggunakan virtualenv". EDIT: sebenarnya, itu berhasil! Itu juga menunjukkan pesan kesalahan tentang "ensurepip".
rspeer
2
Saya memutakhirkan python dari 3.5.1 ke 3.6.4 di sistem saya. Dan untuk memutakhirkan python di virtualenv saya, saya harus secara eksplisit menyebutkan python3.6 dalam perintah:python3.6 -m venv --upgrade <path_of_existing_env>
Sarfraaz Ahmed
1
Dalam kasus saya, bin/pythondan bin/python3masih tertaut ke python3.4biner lama , dan saya harus mengatur tautan secara manual. Juga, apakah ada cara untuk menghapus versi python yang sekarang ketinggalan zaman?
Jens
4
Error: Command '['/Users/me/Sites/site/venv3/bin/python3', '-Im', 'ensurepip', '--upgrade', '--default-pip']' returned non-zero exit status 1.>> Saya mengerti apa artinya? Saya tidak melihat proses python aktif, tidak dapat memutakhirkan.
user305883
1
@ user305883 Saya mendapat kesalahan serupa setelah saya memutakhirkan versi sistem saya Python dari 3,5 menjadi 3,6 (dan menghapus 3,5). Saya harus menginstal ulang 3.5 dan menjalankannya python3.6 -m venv --upgrade ENV_DIRagar berfungsi. Saya pikir saya masih harus memperbarui beberapa tautan simbolis di ENV_DIR/bin. Oleh karena itu, triknya adalah memperbarui dengan versi Python baru sementara versi lama masih diinstal.
AstroFloyd
24

Diperbarui lagi: Metode berikut ini mungkin tidak berfungsi di versi virtualenv yang lebih baru. Sebelum Anda mencoba membuat modifikasi ke virtualenv lama, Anda harus menyimpan dependensi dalam file persyaratan (pip freeze > requirements.txt) dan membuat cadangannya di tempat lain. Jika terjadi kesalahan, Anda masih dapat membuat virtualenv baru dan menginstal dependensi lama di dalamnya (pip install -r requirements.txt).

Diperbarui: Saya mengubah jawaban 5 bulan setelah saya awalnya menjawab. Metode berikut ini lebih nyaman dan kuat.

Efek samping: itu juga memperbaikiSymbol not found: _SSLv2_methodpengecualian ketika Anda melakukannyaimport ssldi lingkungan virtual setelah memutakhirkan Python ke v2.7.8.

Pemberitahuan: Saat ini, ini adalah untuk 2.7.x Python hanya .


Jika Anda menggunakan Homebrew Python di OS X, pertama deactivatesemua virtualenv, kemudian tingkatkan Python:

brew update && brew upgrade python

Jalankan perintah berikut ( <EXISTING_ENV_PATH>adalah jalur lingkungan virtual Anda):

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

Terakhir, buat kembali lingkungan virtual Anda:

virtualenv <EXISTING_ENV_PATH>

Dengan melakukannya, file inti Python lama dan pustaka standar (plus setuptoolsdan pip) akan dihapus, sementara pustaka kustom dipasang disite-packages dalamnya dipertahankan dan berfungsi, segera setelah mereka berada di Python murni. Perpustakaan biner mungkin atau mungkin tidak perlu diinstal ulang agar berfungsi dengan benar.

Ini bekerja untuk saya di 5 lingkungan virtual dengan Django diinstal.

BTW, jika ./manage.py compilemessagestidak berfungsi setelah itu, coba ini:

brew install gettext && brew link gettext --force
Rockallite
sumber
Satu-satunya file yang harus saya hapus adalah bin/pythonfile.
Koen.
Untuk beberapa versi Python yang lebih lama, menghapus setuptoolsdan pipdiperlukan.
Rockallite
1
Saya juga harus menghapus <EXISTING_ENV_PATH>/.Pythonkarena itu merusak penciptaan virtualenv.
Kiran Jonnalagadda
2
Berdasarkan jawaban ini saya menulis sebuah skrip kecil (dengan atribusi lengkap): burgundywall.com/post/update-all-python-virtual-environmentments
Kurt
Anda sebenarnya dapat dengan mudah menghapus lingkungan virtual Anda dengan menjalankan rmvirtualenv <env_name>dan akan menghapus semua dependensinya yang berjajar :) Lihat lebih lanjut di: virtualenvwrapper.readthedocs.io/en/latest/…
Nick Lucas
7

Saya tidak dapat membuat virtualenv baru di atas yang lama. Tetapi ada alat dalam pip yang membuatnya jauh lebih cepat untuk menginstal ulang persyaratan menjadi venv baru. Pip dapat membangun masing-masing item dalam keperluan Anda.txt ke dalam paket roda, dan menyimpannya dalam cache lokal. Saat Anda membuat venv baru dan menjalankan instalasi pip di dalamnya, pip akan secara otomatis menggunakan roda prebuilt jika menemukannya. Pemasangan roda jauh lebih cepat daripada menjalankan setup.py untuk setiap modul.

~ / .Pip / pip.conf saya terlihat seperti ini:

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

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

Saya memasang roda ( pip install wheel), lalu jalankan pip wheel -r requirements.txt. Ini menyimpan roda yang dibangun di roda-dir di pip.conf saya.

Sejak saat itu, setiap kali saya menginstal salah satu dari persyaratan ini, itu menginstal mereka dari roda, yang cukup cepat.

Russ Egan
sumber
1
Bagi kebanyakan orang, saya pikir memanfaatkan mesin pip untuk melakukan pekerjaan itu masuk akal, tetapi bagi siapa pun yang telah menyesuaikan virtualenvs mereka pasca-aktifkan, pra-aktifkan, dll, ini bukan pilihan yang diinginkan karena semua yang hilang dan harus dibaca secara manual.
dpwrussell
6

Cara memutakhirkan versi Python untuk proyek virtualenvwrapper yang ada dan tetap menggunakan nama yang sama

Saya menambahkan jawaban untuk siapa saja yang menggunakan virtualenvwrapper yang luar biasa dari Doug Hellmann khusus karena jawaban yang ada tidak melakukannya untuk saya.

Beberapa konteks:

  • Saya mengerjakan beberapa proyek yang Python 2 dan beberapa yang Python 3; sementara saya ingin menggunakan python3 -m venv, itu tidak mendukung lingkungan Python 2
  • Ketika saya memulai proyek baru, saya menggunakan mkprojectyang menciptakan lingkungan virtual, membuat direktori proyek kosong, dan memasukkannya ke dalamnya
  • Saya ingin terus menggunakan workonperintah virtualenvwrapper untuk mengaktifkan proyek apa pun terlepas dari versi Python

Petunjuk arah:

Katakanlah proyek Anda saat ini dinamai foodan saat ini sedang menjalankan Python 2 ( mkproject -p python2 foo), meskipun perintahnya sama apakah meningkatkan dari 2.x ke 3.x, 3.6.0 ke 3.6.1, dll. Saya juga mengasumsikan Anda sedang dalam lingkungan virtual yang diaktifkan.

1. Nonaktifkan dan hapus lingkungan virtual lama:

$ deactivate
$ rmvirtualenv foo

Perhatikan bahwa jika Anda telah menambahkan perintah khusus ke kait (mis., bin/postactivate) Anda harus menyimpannya sebelum menghapus lingkungan.

2. Simpan proyek nyata di direktori temp:

$ cd ..
$ mv foo foo-tmp

3. Buat lingkungan virtual baru (dan dir proyek) dan aktifkan:

$ mkproject -p python3 foo

4. Ganti dir proyek yang dihasilkan kosong dengan proyek nyata, ubah kembali ke dir proyek:

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

5. Instal ulang dependensi, konfirmasi versi Python baru, dll:

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

Jika ini adalah kasus penggunaan umum, saya akan mempertimbangkan membuka PR untuk menambahkan sesuatu seperti $ upgradevirtualenv/ $ upgradeprojectke virtualenvwrapper.

Taylor Edmiston
sumber
1
Ya silahkan. Saya sudah setengah jalan dan mendapat masalah besar ... Pemeriksaan akan menyenangkan karena langkah pertama tidak dapat
dibatalkan
2

Pendekatan ini selalu berhasil untuk saya:

# 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

Diambil dari:

Anton Danilchenko
sumber
1

Saya memindahkan direktori rumah saya dari satu mac ke mac lainnya (Mountain Lion ke Yosemite) dan tidak menyadari tentang kerusakan virtual sampai saya kehilangan laptop lama. Saya memiliki titik virtualenv ke Python 2.7 diinstal oleh brewdan karena Yosemite datang dengan Python 2.7, saya ingin memperbarui virtualenv saya ke sistem python. Ketika saya berlari virtualenvdi atas direktori yang ada, saya mendapatkan OSError: [Errno 17] File exists: '/Users/hdara/bin/python2.7/lib/python2.7/config'kesalahan. Dengan coba-coba, saya mengatasi masalah ini dengan menghapus beberapa tautan dan memperbaiki beberapa lagi secara manual. Inilah yang akhirnya saya lakukan (mirip dengan yang dilakukan @Rockalite, tetapi lebih sederhana):

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

Setelah ini, saya bisa menjalankan virtualenv di atas direktori yang ada.

haridsv
sumber
1

Pada OS X atau macOS menggunakan Homebrew untuk menginstal dan memutakhirkan Python3 saya harus menghapus tautan simbolis sebelum python -m venv --upgrade ENV_DIRbekerja.

Saya menyimpan yang berikut ini di upgrade_python3.sh jadi saya akan mengingat berapa bulan dari sekarang ketika saya harus melakukannya lagi:

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

UPDATE: sementara ini tampaknya bekerja dengan baik pada awalnya, ketika saya menjalankan py.test itu memberikan kesalahan Pada akhirnya saya baru saja menciptakan kembali lingkungan dari file persyaratan.

Jeff C Johnson
sumber
py.testtidak berfungsi karena `~ / .virtualenvs / myenv / bin / python3.7 bukan symlink, jadi tidak diperbarui.
Ash Berlin-Taylor
Ah sebenarnya, masalahnya adalah Ada ~/.virtualenvs/myenv/.Pythonyang merupakan symlink.
Ash Berlin-Taylor
1

Jika Anda menggunakan pipenv, saya tidak tahu apakah mungkin untuk memutakhirkan lingkungan di tempat, tetapi setidaknya untuk peningkatan versi kecil tampaknya cukup pintar untuk tidak membangun kembali paket dari awal ketika menciptakan lingkungan baru. Misalnya, dari 3.6.4 ke 3.6.5:

$ 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
>>>
David Moles
sumber
luar biasa! Terima kasih atas permata ini
Mayur Patil
1

Saya hanya ingin mengklarifikasi, karena beberapa jawaban merujuk venvdan yang lain merujuk virtualenv.

Penggunaan -patau --pythonbendera didukung pada virtualenv, tetapi tidak pada venv. Jika Anda memiliki lebih dari satu versi Python dan Anda ingin menentukan yang mana untuk dibuat venv, lakukan di baris perintah, seperti ini:

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

Anda tentu saja dapat memutakhirkan venvseperti yang ditunjukkan orang lain, tetapi itu mengasumsikan Anda telah memutakhirkan Python yang digunakan untuk membuatnya venvdi tempat pertama. Anda tidak dapat memutakhirkan ke versi Python yang belum Anda miliki di sistem Anda di suatu tempat, jadi pastikan untuk mendapatkan versi yang Anda inginkan, pertama, lalu buat semua vv yang Anda inginkan darinya.

Malik A. Rumi
sumber
1

Langkah 1: Bekukan persyaratan & ambil cadangan env yang ada

pip freeze > requirements.txt
deactivate
mv env env_old

Langkah 2: Instal Python 3.7 & aktifkan lingkungan virutal

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

Langkah 3: Instal persyaratan

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

Untuk semua orang yang memiliki masalah

Kesalahan: Perintah '[' / Pengguna / saya / Situs / situs / venv3 / bin / python3 ',' -Im ',' ensurepip ',' --upgrade ',' --default-pip ']' dikembalikan bukan nol status keluar 1.

Anda harus menginstal python3.6-venv

 sudo apt-get install python3.6-venv
JanL
sumber