Python και απομονωμένα περιβάλλοντα

Τα εικονικά περιβάλλοντα (virtual envs) είναι πολύ χρήσιμα. Με απλά λόγια τα εικονικά περιβάλλοντα μας δίνουν την δυνατότητα να εγκαθιστούμε πακέτα και βιβλιοθήκες μόνο για ένα συγκεκριμένο project και όχι global στο σύστημά μας.

Και γιατί να μην τα εγκαταστήσω global για να τα έχω προσβάσιμα από όλα τα projects μου;

Πολύ καλή ερώτηση! Αλλά έχει και πολύ απλές απαντήσεις!

  1. Μπορεί να θέλεις να χρησιμοποιήσεις διαφορετικές εκδόσεις μιας βιβλιοθήκης σε κάποιο project επειδή πολύ απλά ο προγραμματιστής που την έχει φτιάξει δεν την έχει αναβαθμίσει ακόμα ώστε να δουλεύει με πιο ενημερωμένες εκδόσεις.
  2. Προγράμματα που τρέχεις στο σύστημά σου και χρησιμοποιούν κάποιες στάνταρ εκδόσεις βιβλιοθηκών να σταματήσουν να τρέχουν αν εσύ πειράξεις τις βιβλιοθήκες για να τρέξεις ένα συγκεκριμένο project.
  3. Να χρειάζεσαι μια συγκεκριμένη βιβλιοθήκη η οποία θα χρησιμοποιηθεί για ένα project και πιθανότατα δεν θα ξανά ασχοληθείς ποτέ. (Οπότε να την εξαφανίσεις μετά το πέρας της δουλειάς σου)

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

Για αν προσωρήσουμε θα χρειαστεί να έχουμε εγκατεστημένα στο σύστημά μας τα παρακάτω πακέτα:
Προφανώς κάποια έκδοση της python !
και μετά:
virtualenv

Ανοίγω ένα τερματικό και φτιάχνω ένα test directory για να κάνω εκεί μέσα ότι θέλω και αν κάτι το κάνω στραβά, απλά το διαγράφω και τελείωσε η υπόθεση.

mkdir testPython
cd testPython

Δημιουργώ ένα περιβάλλον και του δίνω ένα όνομα:

virtualenv ENVIROMENT_NAME

Η παραπάνω εντολή δημιουργεί έναν φάκελο μέσα στον οποίο έχει ότι χρειάζεται για το εικονικό περιβάλλον.

Μπορώ να ρυθμίσω και άλλα πράγματα κατά την δημιουργία του περβάλλοντος (όπως ας πούμε τον interpreter που θα χρησιμοποιεί)

virtualenv -p python2 envname

Τώρα για να χρησιμοποιήσω αυτό το περιβάλλον και όχι το global του συστήματός μου αρκεί να χρησιμοποιήσω την εντολή source και μετά να δώσω το path για την ενεργοποίηση του περιβάλλοντος.

Έστω ότι το περιβάλλον μου λέγεται `linuxgrenv’. Τότε:

source linuxgrenv/bin/activate

Πλέον το τερματικό, μου δείχνει ότι βρίσκομαι σε αυτό το περιβάλλον:
image
Αυτό σημαίνει πως ό,τι module και να εγκαταστήσω θα εγκατασταθεί μόνο σε αυτό το περιβάλλον.

Πάμε να κάνουμε και μια μικρή δοκιμή.

pip install matplotlib

Και ετοιμάζω ένα μικρό script για να κάνω ένα απλό γράφημα

import matplotlib.pyplot as plt # Συμπεριλαμβάνω την βιβλιοθήκη που χρειάζομαι για να κάνω το γράφημα.

# Ετοιμάζω το x της συνάρτησής μου.
x = [i for i in range(-100,100)]

# Αρχικοποιώ μια λίστα για να βάλω την έξοδο της συνάρτησής μου.
y = []

# Υπολογίζω την έξοδο της συνάρτησης
for i in x:
    y.append(i**2)

plt.plot(x,y)
plt.savefig('plot.png')

Το σώζω ως plot.py
Και το τρέχω:

python plot.py

Και μέσα το directory που το τρέξαμε ιδού το αποτέλεσμα: (με όνομα plot.png)
image

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

deactivate

Αν τώρα δοκιμάσουμε να ξανά τρέξουμε το script:

python plot.py
Traceback (most recent call last):
  File "/home/christ0s/Python/testPython/plot.py", line 1, in <module>
    import matplotlib.pyplot as plt # Συμπεριλαμβάνω την βιβλιοθήκη που χρειάζομαι για να κάνω το γράφημα.
ModuleNotFoundError: No module named 'matplotlib'

Επειδή πολύ απλά έχουμε βγεί από το εικονικό περιβάλλον και δεν υπάρχει εγκατεστημένη η matplotlib.

Αν τώρα θέλω να διαγράψω αυτό το περιβάλλον επειδή τελείωσα την δουλειά μου, απλά διαγράφω το directory που έχει δημιουργηθεί και μαζί πετιούνται και τα modules και όλα.

rm -r linuxgrenv

Hint!!!
Εάν χρησιμοποιείτε συχνά ένα περιβάλλον και δεν θέλετε κάθε φορά να τρέχετε την source με ένα μακρινάρι από πίσω, μπορείτα να φτιάξετε ένα alias που σας βολεύει!
πχ

alias mypython='source /home/$USER/Python/linuxgrenv/activate'

Απορίες, διορθώσεις, βελτιώσεις και άλλα κόλπα που θα βοηθήσουν όλους που ασχολούνται πάντα ευπρόσδεκτα!

8 «Μου αρέσει»

Πρόσθεσε πως το virtualenv θέλει εγκατάσταση με pip. Επίσης στις τελευταίες εκδόσεις η Python έχει αποκτήσει το module venv στη stdlib που έχει ένα μέρος (σύγκριση) των δυνατοτήτων του virtualenv. Η χρήση είναι όμοια

$ python -m venv ENVIROMENT_NAME
$ source ENVIROMENT_NAME/bin/activate

Επίσης, ισχύει νομίζω και για τα δύο, δεν γίνεται απλά κάποιος να αλλάξει τη τοποθεσία του φακέλου, αλλά χρειάζεται να επεξεργαστεί και τα αρχεία στο ./bin για να δείχνουν στις νέες τοποθεσίες.

2 «Μου αρέσει»

Ωραίες οι παρατηρήσεις! Και κάπως έτσι μέσα από την κουβέντα, μαθαίνουμε όλοι!

Βρήκα στα γρήγορα αυτό.

Μπορεί να εγκατασταθεί και από τον package manager του συστήματος. Και επειδή πρέπει να είναι global, το βάζω έτσι για να αναβαθμίζεται και μόνο του όποτε χρειάζεται.

Δεν το γνώριζα! Θα το δοκιμάσω και θα δω αν με βολεύει εξίσου και σε τι πιθανώς να μην με καλύπτει.