Apa cara yang tepat untuk mengelola beberapa versi python?


21

Saya memiliki mesin dengan Python 2.6 diinstal sebagai Python default. Kemudian, saya menginstal Python 2.7, dan secara manual membuat / usr / bin / python sebagai symlink ke instalasi baru.

Kemudian, saya mengalami masalah dengan perintah-tidak-ditemukan . Saya mencoba menginstalnya kembali:

sudo apt-get remove command-not-found

dan saya mendapatkan kesalahan ini:

/usr/bin/python does not match the
python default version. It must be
reset to point to python2.6

Tapi saya benar-benar ingin Python 2.7 menjadi default. Bagaimana cara memperbaiki kekacauan ini?

Jawaban:


16

Mengubah Python default (atau Perl, dll) pada OS adalah ide yang sangat buruk. Penerjemah ini sebenarnya adalah bagian dari OS dan mungkin ada komponen OS lain yang ditulis secara khusus untuk bekerja dengan versi penerjemah itu.

Misalnya pada Redhat alat yum yang melakukan pembaruan perangkat lunak sistem adalah aplikasi python. Anda benar-benar tidak ingin memecahkan ini. Aplikasi semacam itu mungkin bergantung pada modul python tertentu, mungkin yang tidak standar, yang diinstal yang mungkin tidak dimiliki versi yang Anda instal. Sebagai contoh di Ubuntu saya percaya beberapa alat OS built-in yang ditulis dengan Python menggunakan ORM yang disebut Storm yang bukan bagian dari perpustakaan standar Python. Apakah instalasi Python bersih Anda 2.7 menginstal versi yang diharapkan dari modul Storm? Apakah ada versi Storm? Tidak? Maka Anda baru saja memecahkan sebagian OS Anda.

Cara yang tepat untuk melakukan ini adalah menginstal versi python yang Anda sukai dan mengatur akun pengguna Anda untuk menggunakannya dengan mengatur .bash_profile Anda, path dan semacamnya. Anda mungkin juga ingin melihat modul virtualenv untuk Python.


1
Googled jalan saya ke sini. Akan -1 jika saya punya perwakilan di tumpukan ini. Mengapa? Karena pendekatan yang disarankan mengatakan hanya "instal versi python yang Anda sukai". Bagaimana itu dilakukan tanpa menyiram sistem python?
jez

@ jez Pengguna harus merujuk pada instruksi instalasi untuk aplikasi mereka dan kombinasi pilihan OS. Dalam paket instalasi bahasa umum akan menginstal ke lokasi jinak, tidak menimpa komponen OS inti sehingga menimpa versi OS akan menjadi kasus khusus.
Simon Hibbs

8

Bagaimana cara memperbaiki kekacauan ini?

Tidak lebih dari menginstal ulang python. Ini akan membatalkan perubahan Anda (symlink).

Mengapa Anda menginginkannya sebagai default? Setiap kali Anda membutuhkannya, cukup gunakan python2.7atau sertakan #!/usr/bin/python2.7(shebang) di awal skrip (yang dapat dieksekusi) Anda.

Jika Anda bersikeras memiliki standar python2.7sistem, gunakan Ubuntu yang lebih baru (saat ini Ubuntu 11,04, dengan nama sandi Natty). Menggunakan versi itu sebagai default.

Di masa depan, hindari melakukan intervensi manual seperti apa yang Anda lakukan dengan hal symlink. Hal ini terutama berlaku untuk file yang dikelola distro, dan yang paling khusus untuk binatang yang kompleks seperti instalasi Python.


Saya berpikir bahwa masuk akal untuk mengubah instalasi python default begitu saya memutakhirkan. Saya menginginkannya sebagai default karena saya ingin bekerja dengan python yang lebih baru ... sebagai default. Ketika saya mengetik pythondari bash, saya ingin mendapatkan python baru. Apakah ada cara yang lebih baik untuk melakukan ini daripada yang saya lakukan?
ripper234

Hanya untuk dicatat - saya tidak berpikir ada yang salah dengan cara saya menginstal python 2.7. Satu-satunya langkah "tidak lazim" adalah mengubah symlink, yang saya pikir merupakan cara yang tepat untuk mengaturnya sebagai default. Apakah ada cara yang lebih baik?
ripper234

2
@ripper: Saya kira saya datang ke utas ini sedikit terlambat. Seperti yang dikatakan Tshepang, pythonpaket di Ubuntu menentukan versi sistem. Sekarang, adalah mungkin untuk menyesuaikan instalasi Anda sehingga python 2.7 adalah default dengan membuat paket python Anda sendiri, dll, tetapi jika demikian, Anda akan secara efektif menjadi pengelola instalasi Python Anda alih-alih Ubuntu, dan Anda harus belajar bagaimana Python dikelola di Debian / Ubuntu. Ingatlah bahwa paket Python lain dalam sistem dikonfigurasikan untuk bekerja dengan 2.6 sebagai default, jadi, terlepas dari hal lain, kerusakan dapat terjadi.
Faheem Mitha

1
@Tepang: Ringkasan bagus!
Faheem Mitha

12
@ ripper234: Jangan ubah apa pun /usr/bin, itu disediakan untuk distribusi Anda. Sebagai gantinya, buat /usr/local/bin/pythontautan simbolis ke python2.7. Kemudian skrip menggunakan #!/usr/bin/env python(idiom yang disarankan), serta mengetik pythondi baris perintah, akan menjalankan Python 2.7. Script dari distribusi yang ingin Python dari distribusi dapat terus memanggil #!/usr/bin/python.
Gilles 'SO- stop being evil'

2

Penafian: saya baru saja memposting jawaban yang sama untuk stack overflow:

/programming/2812520/pip-dealing-with-multiple-python-versions/50319252

Inilah pendapat saya tentang masalah ini. Bekerja untuk Python3. Fitur utamanya adalah:

  • Setiap versi Python dikompilasi dari sumber
  • Semua versi diinstal secara lokal
  • Tidak memotong-motong instalasi Python default sistem Anda dengan cara apa pun
  • Setiap versi Python diisolasi dengan virtualenv

Langkah-langkahnya adalah sebagai berikut:

  1. Jika Anda memiliki beberapa versi python tambahan yang dipasang dengan cara lain, singkirkan, misalnya, hapus $ HOME / .local / lib / python3.x , dll. (Juga yang diinstal secara global). Jangan sentuh versi python3 default sistem Anda.

  2. Sumber unduhan untuk versi python yang berbeda di bawah struktur direktori berikut:

    $HOME/
        python_versions/ : download Python-*.tgz packages here and "tar xvf" them.  You'll get directories like this:
          Python-3.4.8/
          Python-3.6.5/
          Python-3.x.y/
          ...
  3. Di setiap direktori "Python-3.xy /", lakukan hal berikut ( JANGAN gunakan "sudo" di salah satu langkah!):

    mkdir root
    ./configure --prefix=$PWD/root 
    make -j 2
    make install
    virtualenv --no-site-packages -p root/bin/python3.x env
  4. Di "python_versions /" buat file seperti ini:

    env_python3x.bash:
    
    #!/bin/bash
    echo "type deactivate to exit"
    source $HOME/python_versions/Python-3.x.y/env/bin/activate
  5. Sekarang, kapan saja Anda ingin memilih python3.x, lakukan

    source $HOME/python_versions/env_python3x.bash

    untuk memasuki virtualenv

  6. Saat berada di virtualenv, instal paket python favorit Anda dengan

    pip install --upgrade package_name
  7. Untuk keluar dari versi virtualenv dan python cukup ketik "nonaktifkan"


0

Kami banyak menaruh distribusi python di Mac dan Ubuntu dan inilah rekomendasi saya.

  1. Biarkan sistem python tanpa gangguan: jangan pernah gunakan itu.

  2. Jika Anda hanya memerlukan satu distribusi python primer, unduh dan instal Canopy dari enthought. Saat menginstal, pilih "set as my python system", dan kemudian Anda dapat menginstal paket dari manajer paket GUI Canopy.

    • Canopy juga dapat digunakan pip, perintah manajer paket PyPi yang memungkinkan Anda menginstal paket (mis. pip install python-twitter)
  3. Jika Anda berencana untuk menggunakan lingkungan virtual (yaitu Anda sedang mengembangkan program python dan menginginkan lingkungan python bersih khusus untuk masing-masing, dengan cara yang mudah untuk beralih di antara mereka), saya akan merekomendasikan Anaconda melalui Canopy karena untuk itu adalah alat manajer lingkungan virtual . Ini akan membiarkanmu

0

Pyenv

https://github.com/pyenv/pyenv

Pyenv memungkinkan Anda untuk mengelola beberapa versi Python tanpa sudo untuk satu pengguna, seperti Node.js NVM dan Ruby RVM .

Instal Pyenv:

curl https://pyenv.run | bash

Kemudian tambahkan ke .bashrc:

export PATH="${HOME}/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

Temukan versi Python untuk diinstal:

pyenv install --list

Instal versi python yang Anda inginkan:

# Increase the chances that the build will have all dependencies.
# https://github.com/pyenv/pyenv/wiki/Common-build-problems
sudo apt build-dep python3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
  libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
  xz-utils tk-dev libffi-dev liblzma-dev python-openssl git

# Build and install a Python version from source.
pyenv install 3.8.0

Daftar versi Python yang tersedia:

pyenv versions

Kami sekarang memiliki:

* system (set by /home/cirsan01/.pyenv/version)
  3.8.0

Pilih versi python yang berbeda:

pyenv global 3.8.0
python --version
python3 --version

Kedua output:

Python 3.8.0

Kita sekarang dapat melanjutkan untuk menginstal dan menggunakan paket-paket secara normal:

pip install cowsay
python -c 'import cowsay; cowsay.tux("Python is fun")'
cowsay 'hello'

Kami dapat mengonfirmasi bahwa semuanya terpasang secara lokal di lingkungan kami yang bersih dengan:

python -c 'import cowsay; print(cowsay.__file__)'
which cowsay

Per penggunaan proyek

Di bagian sebelumnya, kami melihat cara menggunakan pyenv di pengaturan global.

Namun, apa yang biasanya Anda inginkan adalah mengatur python dan versi paket tertentu pada basis per proyek. Ini adalah cara untuk melakukannya.

Pertama instal versi Python yang Anda inginkan seperti sebelumnya.

Kemudian, dari dalam direktori proyek Anda, atur versi python yang diinginkan dengan:

pyenv local 3.8.0

yang membuat file yang .python-versionberisi string versi.

Dan sekarang mari kita instal paket secara lokal hanya untuk proyek kami: TODO: sepertinya tidak ada cara yang bagus: /programming/30407446/pyenv-choose-virtualenv-directory/59267972#59267972

Sekarang, ketika seseorang ingin menggunakan proyek Anda, mereka akan melakukan:

pyenv local

yang mengatur versi Python ke yang benar.

Utas terkait:

Diuji pada Ubuntu 18.04, pyenv 1.2.15.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.