Πώς να διαχειριστείτε πολλές εκδόσεις Python και εικονικά περιβάλλοντα

Προσθήκη Ιανουαρίου 2019: Εάν επιστρέφετε σε αυτό το ιστολόγιο μετά την αναβάθμιση σε macOS Mojave, ανατρέξτε σε αυτό το ζήτημα github για μια λύση στο κοινό πρόβλημα "zlib not available" του pyenv.

Πριν ξεκινήσουμε, ας δούμε εν συντομία τους όρους που χρησιμοποιούνται στον τίτλο:

  • Πολλαπλές εκδόσεις Python : Διαφορετικές εγκαταστάσεις του Python στον ίδιο υπολογιστή, για παράδειγμα 2.7 και 3.4.
  • Εικονικά περιβάλλοντα : απομονωμένα ανεξάρτητα περιβάλλοντα που μπορούν να έχουν και μια συγκεκριμένη έκδοση του Python και οποιωνδήποτε πακέτων συγκεκριμένων έργων εγκατεστημένα σε αυτά, χωρίς να επηρεάζονται άλλα έργα.

Εδώ θα εξετάσουμε τρία διαφορετικά εργαλεία για να εργαστείτε με αυτά, και πότε μπορεί να χρειαστείτε το καθένα. Ας εξερευνήσουμε τις περιπτώσεις χρήσης για:

  • venv / pyvenv
  • pyenv
  • pyenv-virtualenv

Εάν χρησιμοποιείτε μια μόνο έκδοση του Python, πείτε την έκδοση 3.3+ και θέλετε να διαχειριστείτε διαφορετικά εικονικά περιβάλλοντα, τότε venvείναι το μόνο που χρειάζεστε.

Εάν θέλετε να χρησιμοποιήσετε πολλές εκδόσεις του Python σε 3.3+ , με ή χωρίς εικονικά περιβάλλοντα , συνεχίστε να διαβάζετε pyenv.

Εάν θέλετε επίσης να εργαστείτε με το Python 2 , τότε pyenv-virtualenvείναι ένα εργαλείο που πρέπει να λάβετε υπόψη.

venv

Από το Python 3.3+ περιλαμβάνεται το venvπακέτο. Είναι ιδανικό για τη δημιουργία ελαφρών εικονικών περιβαλλόντων.

Μέχρι το Python 3.6, ένα σενάριο που ονομάστηκε pyvenvσυμπεριλήφθηκε επίσης ως περιτύλιγμα venv, αλλά αυτό έχει καταργηθεί. Θα αφαιρεθεί πλήρως στο Python 3.8. Η ίδια ακριβώς λειτουργικότητα είναι διαθέσιμη κατά τη χρήση venvκαι οποιαδήποτε υπάρχουσα τεκμηρίωση πρέπει να ενημερωθεί. Για όσους ενδιαφέρονται μπορείτε να διαβάσετε τους λόγους πίσω από την υποτίμηση pyvenv.

venv χρησιμοποιείται για τη δημιουργία ενός νέου περιβάλλοντος μέσω της εντολής τερματικού:

$ python3 -m venv directory-name-to-create

ενεργοποιήθηκε με:

$ source name-given/bin/activate

και απενεργοποιήθηκε με απλά:

$ deactivate

Εάν πρέπει να καταργήσετε εντελώς το περιβάλλον μετά την απενεργοποίησή του, μπορείτε να εκτελέσετε:

$ rm -r name-given

Από προεπιλογή, το περιβάλλον που δημιουργεί θα είναι η τρέχουσα έκδοση του Python που χρησιμοποιείτε. Εάν γράφετε τεκμηρίωση και θέλετε την πρόσθετη ασφάλεια ότι η σωστή έκδοση του Python χρησιμοποιείται από τον αναγνώστη σας, μπορείτε να καθορίσετε τον κύριο και τον μικρό αριθμό έκδοσης στην εντολή, όπως:

$ python3.6 -m venv example-three-six

Εάν ο αναγνώστης χρησιμοποιεί μια έκδοση διαφορετική από το 3.6, τότε η εντολή δεν θα είναι επιτυχής και θα εμφανίζεται στο μήνυμα σφάλματος. Ωστόσο, οποιαδήποτε έκδοση ενημέρωσης κώδικα (για παράδειγμα 3.6.4) θα λειτουργήσει.

Όταν το περιβάλλον είναι ενεργό, τυχόν πακέτα μπορούν να εγκατασταθούν σε αυτό μέσω του pipκανονικού. Από προεπιλογή, το νέο περιβάλλον δεν θα περιλαμβάνει πακέτα που έχουν ήδη εγκατασταθεί στο μηχάνημα. Καθώς η pipίδια δεν θα εγκατασταθεί απαραίτητα στο μηχάνημα. Συνιστάται η πρώτη αναβάθμιση pipστην πιο πρόσφατη έκδοση, χρησιμοποιώντας pip install --upgrade pip.

Τα έργα θα έχουν συνήθως ένα requirements.txtαρχείο που καθορίζει τις εξαρτήσεις του. Αυτό επιτρέπει στην εντολή συντόμευσης pip install -r requirements.txtνα εγκαταστήσει γρήγορα όλα τα πακέτα στο πρόσφατα δημιουργημένο εικονικό περιβάλλον. Θα υπάρχουν μόνο στο εικονικό περιβάλλον. Δεν θα είναι διαθέσιμο όταν είναι απενεργοποιημένο, αλλά θα παραμείνει όταν επανενεργοποιηθεί.

Εάν δεν χρειάζεται να χρησιμοποιήσετε πρόσθετες εκδόσεις του ίδιου του Python, τότε αυτό είναι το μόνο που χρειάζεστε για να δημιουργήσετε απομονωμένα, συγκεκριμένα έργα, εικονικά περιβάλλοντα.

pyenv

Εάν θέλετε να χρησιμοποιήσετε πολλές εκδόσεις του Python σε ένα μηχάνημα, τότε pyenvείναι ένα εργαλείο που χρησιμοποιείται συνήθως για εγκατάσταση και εναλλαγή μεταξύ των εκδόσεων. Αυτό δεν πρέπει να συγχέεται με το pyvenvσενάριο που έχει αναφερθεί προηγουμένως . Δεν συνοδεύεται από Python και πρέπει να εγκατασταθεί ξεχωριστά.

Η pyenvτεκμηρίωση περιλαμβάνει μια υπέροχη περιγραφή του τρόπου λειτουργίας του, οπότε εδώ θα δούμε απλά πώς να το χρησιμοποιήσουμε.

Πρώτον, θα πρέπει να το εγκαταστήσουμε. Εάν χρησιμοποιείτε Mac OS X, μπορούμε να το κάνουμε χρησιμοποιώντας το Homebrew, διαφορετικά εξετάστε άλλες επιλογές εγκατάστασης.

$ brew update $ brew install pyenv

Στη συνέχεια, προσθέστε τα παρακάτω στο κάτω μέρος των σεναρίων κελύφους σας για να επιτρέψετε pyenvτην αυτόματη αλλαγή εκδόσεων για εσάς:

eval "$(pyenv init -)"

Για να το κάνετε, ανοίξτε το σενάριο κελύφους που χρησιμοποιείτε, μέσω $ ~/.zshrc, $ ~/.bashrcή $ ~/.bash_profileκαι αντιγράψτε και επικολλήστε την παραπάνω γραμμή στο.

Η εκτέλεση pyenv versionsθα δείξει ποιες εκδόσεις Python είναι εγκατεστημένες αυτήν τη στιγμή, με την *επόμενη σε αυτήν που χρησιμοποιείται αυτήν τη στιγμή. pyenv versionτο εμφανίζει απευθείας και python --versionμπορεί να χρησιμοποιηθεί για να το επαληθεύσει.

Για να εγκαταστήσετε μια πρόσθετη έκδοση, ας πούμε 3.4.0, απλώς χρησιμοποιήστε pyenv install 3.4.0.

pyenv ψάχνει σε τέσσερα μέρη για να αποφασίσει ποια έκδοση του Python θα χρησιμοποιήσει, με σειρά προτεραιότητας:

  1. Η PYENV_VERSIONμεταβλητή περιβάλλοντος (εάν προσδιορίζεται). Μπορείτε να χρησιμοποιήσετε την pyenv shellεντολή για να ορίσετε αυτήν τη μεταβλητή περιβάλλοντος στην τρέχουσα περίοδο κελύφους.
  2. Το .python-versionαρχείο για συγκεκριμένη εφαρμογή στον τρέχοντα κατάλογο (εάν υπάρχει). Μπορείτε να τροποποιήσετε το .python-versionαρχείο του τρέχοντος καταλόγου με την pyenv localεντολή.
  3. Το πρώτο .python-versionαρχείο βρέθηκε (εάν υπάρχει) αναζητώντας κάθε γονικό κατάλογο, μέχρι να φτάσει στη ρίζα του συστήματος αρχείων σας.
  4. Το αρχείο καθολικής έκδοσης. Μπορείτε να τροποποιήσετε αυτό το αρχείο χρησιμοποιώντας την pyenv globalεντολή. Εάν το αρχείο καθολικής έκδοσης δεν υπάρχει, το pyenv υποθέτει ότι θέλετε να χρησιμοποιήσετε το Python "system". (Με άλλα λόγια, οποιαδήποτε έκδοση θα εκτελεστεί αν το pyenv δεν ήταν στη δική σας PATH.)

Κατά τη δημιουργία ενός νέου έργου που πρόκειται να χρησιμοποιήσει το Python 3.6.4 τότε pyenv local 3.6.4θα εκτελεστεί στον ριζικό του κατάλογο. Αυτό θα καθόριζε και την έκδοση και θα δημιουργούσε ένα .python-versionαρχείο, έτσι ώστε τα μηχανήματα άλλων συνεργατών να το πάρουν.

Η πλήρης περιγραφή των pyenvεντολών είναι μία προς σελιδοδείκτη.

pyenv και venv

Όταν συνεργαζόμαστε με το Python 3.3+, γνωρίζουμε τώρα πώς να εγκαταστήσουμε και να αλλάξουμε μεταξύ διαφορετικών εκδόσεων του Python και πώς να δημιουργήσουμε νέα εικονικά περιβάλλοντα.

Για παράδειγμα, ας πούμε ότι δημιουργήσαμε ένα έργο που θα χρησιμοποιούσε το Python 3.4.

Πρώτα θα μπορούσαμε να ορίσουμε την τοπική μας έκδοση χρησιμοποιώντας pyenv local 3.4.0.

Αν τρέξαμε τότε θα δημιουργηθεί python3 -m venv example-projectένα νέο εικονικό περιβάλλον example-project, χρησιμοποιώντας το τοπικά ενεργοποιημένο Python 3.4.0.

Ενεργοποιούμε τη χρήση source example-project/bin/activateκαι μπορούμε να αρχίσουμε να δουλεύουμε.

Στη συνέχεια θα μπορούσαμε προαιρετικά να τεκμηριώσουμε ότι πρέπει να χρησιμοποιήσει ένας συνεργάτης python3.4 -m venv . Αυτό σημαίνει ότι ακόμη και αν ένας συνεργάτης δεν χρησιμοποιούσε το pyenv, η python3.4εντολή θα λάθος εάν η έκδοση Python δεν ήταν η ίδια κύρια και δευτερεύουσα έκδοση (3 και 4), όπως σκοπεύαμε.

Εναλλακτικά, θα μπορούσαμε να επιλέξουμε απλώς να καθορίσουμε ότι το 3.4.0 έπρεπε να χρησιμοποιηθεί και να διδάξουμε python3 -m venv . Αν πιστεύουμε ότι οποιαδήποτε ve rsion g reater από 3.4 είναι αποδεκτό, τότε μπορούμε επίσης μπορεί να επιλέξει να χρησιμοποιήσει python3πάνω python3.4, ως εάν ο συνεργάτης χρησιμοποιούσε 3,6 τότε οποίες ειδάλλως θα λάβουν επίσης ένα σφάλμα. Αυτή είναι μια συγκεκριμένη απόφαση του έργου.

pyenv-virtualenv

pyenvμπορεί να χρησιμοποιηθεί για την εγκατάσταση και των δύο εκδόσεων Python 2 και 3. Ωστόσο, όπως έχουμε δει, venvπεριορίζεται σε εκδόσεις Python μεγαλύτερες από 3.3.

pyenv-virtualenvείναι ένα εργαλείο για τη δημιουργία εικονικών περιβαλλόντων που είναι ενσωματωμένα pyenvκαι λειτουργεί για όλες τις εκδόσεις του Python. Συνιστάται να χρησιμοποιείτε το επίσημο Python venvόπου είναι δυνατόν. Αλλά αν, για παράδειγμα, δημιουργείτε ένα εικονικό περιβάλλον με βάση 2.7.13, τότε αυτό συγχαίρει pyenv.

Λειτουργεί επίσης καλά με τα condaπεριβάλλοντα Anaconda και Miniconda εάν τα χρησιμοποιείτε ήδη. Υπάρχει virtualenvεπίσης ένα εργαλείο που ονομάζεται . Δεν καλύπτεται εδώ, αλλά συνδέεται στο τέλος.

Μετά την εγκατάσταση pyenv, μπορεί στη συνέχεια να εγκατασταθεί χρησιμοποιώντας το Homebrew (ή εναλλακτικές) ως εξής:

$ brew install pyenv-virtualenv

Στη συνέχεια σε σας .zshrc, .bashrcή .bash_profile(ανάλογα με το κέλυφος που χρησιμοποιείτε) προσθέστε την ακόλουθη προς τα κάτω:

eval "$(pyenv init -)" eval "$(pyenv virtualenv-init -)"

Αυτό επιτρέπει pyenvτην αυτόματη ενεργοποίηση και απενεργοποίηση περιβάλλοντος κατά τη μετακίνηση καταλόγων.

Για να δημιουργήσετε ένα νέο εικονικό περιβάλλον, χρησιμοποιήστε:

$ pyenv virtualenv   // for example $ pyenv virtualenv 2.7.10 my-virtual-env-2.7.10

Τα υπάρχοντα περιβάλλοντα μπορούν να αναφέρονται με:

$ pyenv virtualenvs

Ενεργοποιήθηκε / απενεργοποιήθηκε με:

$ pyenv activate  $ pyenv deactivate

Κατά τη στιγμή της γραφής, κατά τη χρήση θα εμφανιστεί activateη προειδοποίηση prompt changing will be removed from future release. Αυτό αναμένεται και αναφέρεται μόνο στην (env-name)εμφάνιση στο κέλυφος σας και όχι στη χρήση της activateίδιας της εντολής.

Η εγκατάσταση απαιτήσεων λειτουργεί όπως περιγράφεται στο venv. Σε αντίθεση με venvμια rm -rεντολή δεν απαιτείται για την κατάργηση ενός περιβάλλοντος, uninstallυπάρχει μια εντολή.

Τελικές σκέψεις

Μεταξύ αυτών των τριών εργαλείων, έχουμε τη δυνατότητα να συνεργαζόμαστε σε οποιοδήποτε έργο, ανεξάρτητα από την έκδοση του Python ή των απαιτούμενων εξαρτήσεων. Γνωρίζουμε επίσης πώς να τεκμηριώσουμε τις οδηγίες ρύθμισης για χρήση από άλλους σε οποιοδήποτε έργο επεξεργαζόμαστε.

Μπορούμε επίσης να δούμε το σκεπτικό πίσω από το οποίο θα χρησιμοποιηθεί, καθώς δεν θα απαιτούν και οι τρεις προγραμματιστές.

Ας ελπίσουμε ότι αυτό ήταν χρήσιμο και αποτελεί χρήσιμη αναφορά σε συνδυασμό με την παρακάτω τεκμηρίωση.

Ευχαριστώ για την ανάγνωση! ;

Άλλα πράγματα που έχω εξερευνήσει:

  • Mocking ES και CommonJS modules με jest.mock ()
  • Ένας οδηγός για αρχάριους στην υπηρεσία Elastic Container της Amazon

Πόροι

  • Εικονικά περιβάλλοντα Python: Ένα Primer
  • Απόσβεση pyvenv
  • venvΤεκμηρίωση Python
  • venv εναντίον virtualenv
  • Ποια είναι η διαφορά μεταξύ venv, pyvenv, pyenv, virtualenv, virtualenvwrapper, pipenv, κλπ;
  • Πρέπει να εγκαταστήσω pip;