Τα εικονικά περιβάλλοντα (virtual envs) είναι πολύ χρήσιμα. Με απλά λόγια τα εικονικά περιβάλλοντα μας δίνουν την δυνατότητα να εγκαθιστούμε πακέτα και βιβλιοθήκες μόνο για ένα συγκεκριμένο project και όχι global στο σύστημά μας.
Και γιατί να μην τα εγκαταστήσω global για να τα έχω προσβάσιμα από όλα τα projects μου;
Πολύ καλή ερώτηση! Αλλά έχει και πολύ απλές απαντήσεις!
- Μπορεί να θέλεις να χρησιμοποιήσεις διαφορετικές εκδόσεις μιας βιβλιοθήκης σε κάποιο project επειδή πολύ απλά ο προγραμματιστής που την έχει φτιάξει δεν την έχει αναβαθμίσει ακόμα ώστε να δουλεύει με πιο ενημερωμένες εκδόσεις.
- Προγράμματα που τρέχεις στο σύστημά σου και χρησιμοποιούν κάποιες στάνταρ εκδόσεις βιβλιοθηκών να σταματήσουν να τρέχουν αν εσύ πειράξεις τις βιβλιοθήκες για να τρέξεις ένα συγκεκριμένο project.
- Να χρειάζεσαι μια συγκεκριμένη βιβλιοθήκη η οποία θα χρησιμοποιηθεί για ένα project και πιθανότατα δεν θα ξανά ασχοληθείς ποτέ. (Οπότε να την εξαφανίσεις μετά το πέρας της δουλειάς σου)
Για τους παραπάνω λόγους λοιπόν, μπορούμε πολύ απλά και εύκολα να δημιουργήσουμε ένα εικονικό περιβάλλον στην 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
Πλέον το τερματικό, μου δείχνει ότι βρίσκομαι σε αυτό το περιβάλλον:
Αυτό σημαίνει πως ό,τι 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)
Για να βγούμε από το περιβάλλον απλά τρέχουμε την εντολή:
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'
Απορίες, διορθώσεις, βελτιώσεις και άλλα κόλπα που θα βοηθήσουν όλους που ασχολούνται πάντα ευπρόσδεκτα!