Δημιουργία φιλίας Python και Bash: βιβλιοθήκες smart-env και python-shell

Καλημέρα σε όλους.

Σήμερα, η Python είναι μια από τις πιο χρησιμοποιούμενες γλώσσες στον τομέα της δημιουργίας όχι μόνο προϊόντων λογισμικού, αλλά και παροχής της υποδομής τους. Ως αποτέλεσμα, πολλοί devop, είτε με τη θέλησή τους είτε ενάντια σε αυτήν, έπρεπε να μάθουν μια νέα γλώσσα για μετέπειτα χρήση ως συμπλήρωμα στα παλιά καλά σενάρια του Bash. Ωστόσο, το Bash και η Python δηλώνουν διαφορετικές προσεγγίσεις για τη σύνταξη κώδικα και έχουν ορισμένα χαρακτηριστικά, πράγμα που σημαίνει ότι η μεταφορά σεναρίων Bash στη "γλώσσα φιδιού" μερικές φορές αποδεικνύεται μια μεγάλη και όχι ασήμαντη εργασία.

Για να διευκολυνθεί η ζωή των devops, πολλές χρήσιμες βιβλιοθήκες και βοηθητικά προγράμματα στην Python έχουν δημιουργηθεί και συνεχίζουν να δημιουργούνται. Αυτό το άρθρο περιγράφει δύο νέες βιβλιοθήκες που δημιουργήθηκαν από τον συγγραφέα αυτής της ανάρτησης - smart-env и πύθωνα-κέλυφος - και έχει σχεδιαστεί για να απαλλάσσει τους devops από την ανάγκη να δίνουν μεγάλη προσοχή στις περιπλοκές της εργασίας με την Python, αφήνοντας χώρο για πιο ενδιαφέρουσες εργασίες. Το πεδίο δραστηριότητας των βιβλιοθηκών είναι οι μεταβλητές περιβάλλοντος και η εκκίνηση εξωτερικών βοηθητικών προγραμμάτων.

Όποιος ενδιαφέρεται, παρακαλώ να δει γάτα.

Νέα «ποδήλατα»;

Φαίνεται, γιατί να δημιουργήσετε νέα πακέτα για αρκετά συνηθισμένες λειτουργίες; Τι σας εμποδίζει να χρησιμοποιήσετε απευθείας το os.environ και το subprocess.<μέθοδος ή κλάση της επιλογής σας>;

Θα παράσχω στοιχεία υπέρ καθεμιάς από τις βιβλιοθήκες χωριστά.

βιβλιοθήκη smart-env

Πριν γράψετε το δικό σας πνευματικό τέκνο, είναι χρήσιμο να μπείτε στο διαδίκτυο και να αναζητήσετε έτοιμες λύσεις. Φυσικά, υπάρχει κίνδυνος να μην βρείτε αυτό που χρειάζεστε, αλλά αυτό είναι μάλλον ένα «ασφαλιστικό συμβάν». Κατά κανόνα, αυτή η προσέγγιση λειτουργεί και εξοικονομεί πολύ χρόνο και προσπάθεια.

Σύμφωνα με τα αποτελέσματα μηχανή αναζήτησης αποκαλύφθηκαν τα εξής:

  • υπάρχουν πακέτα που τυλίγουν πραγματικά κλήσεις στο os.environ, αλλά ταυτόχρονα απαιτούν ένα σωρό ενέργειες που αποσπούν την προσοχή (δημιουργία παρουσίας μιας κλάσης, ειδικές παραμέτρους σε κλήσεις κ.λπ.).
  • Υπάρχουν καλά πακέτα, τα οποία, ωστόσο, συνδέονται αυστηρά με ένα συγκεκριμένο οικοσύστημα (κυρίως διαδικτυακά πλαίσια όπως το Django) και επομένως δεν είναι καθόλου καθολικά χωρίς αρχείο.
  • υπάρχουν σπάνιες προσπάθειες να γίνει κάτι νέο. Για παράδειγμα, προσθήκη πληκτρολόγησης και αναλύετε ρητά τις τιμές των μεταβλητών καλώντας μεθόδους όπως
    get_<typename>(var_name)

    Ή εδώ μια ακόμη λύση, το οποίο όμως δεν υποστηρίζει το ξεφτιλισμένο πλέον Python 2 (το οποίο, παρά επίσημο RIP, υπάρχουν ακόμα βουνά γραπτού κώδικα και ολόκληρα οικοσυστήματα).

  • Υπάρχουν χειροτεχνίες μαθητών που, για άγνωστο λόγο, κατέληξαν στο upstream PyPI και δημιουργούν μόνο προβλήματα με την ονομασία νέων πακέτων (ειδικά, το όνομα «smart-env» είναι απαραίτητο μέτρο).

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

Απαιτήσεις που ορίστηκαν πριν από τη σύνταξη του smart-env:

  • Το πιο απλό σχήμα χρήσης
  • Υποστήριξη πληκτρολόγησης δεδομένων με εύκολη διαμόρφωση
  • Συμβατό με Python 2.7
  • Καλή κάλυψη κωδικού από δοκιμές

Τελικά όλα αυτά έγιναν αντιληπτά. Εδώ είναι ένα παράδειγμα χρήσης:

from smart_env import ENV

print(ENV.HOME)  # Equals print(os.environ['HOME'])

# assuming you set env variable MYVAR to "True"

ENV.enable_automatic_type_cast()

my_var = ENV.MY_VAR  # Equals boolean True

ENV.NEW_VAR = 100  # Sets a new environment variable

Όπως μπορείτε να δείτε από το παράδειγμα, για να εργαστείτε με μια νέα κλάση, πρέπει απλώς να την εισαγάγετε (δεν χρειάζεται να δημιουργήσετε μια παρουσία - μείον την επιπλέον ενέργεια). Η πρόσβαση σε οποιαδήποτε μεταβλητή περιβάλλοντος επιτυγχάνεται με την αναφορά σε αυτήν ως μεταβλητή της κλάσης ENV, η οποία, στην πραγματικότητα, καθιστά αυτήν την κλάση ένα διαισθητικό περιτύλιγμα για το περιβάλλον του εγγενούς συστήματος, ενώ ταυτόχρονα τη μετατρέπει σε ένα πιθανό αντικείμενο διαμόρφωσης για σχεδόν οποιοδήποτε σύστημα ( Μια παρόμοια προσέγγιση, για παράδειγμα, επιτυγχάνεται στο Django , μόνο εκεί το αντικείμενο διαμόρφωσης είναι η ίδια η μονάδα ρυθμίσεων/πακέτο).

Η ενεργοποίηση/απενεργοποίηση της λειτουργίας υποστήριξης αυτόματης πληκτρολόγησης επιτυγχάνεται χρησιμοποιώντας δύο μεθόδους - enable_automatic_type_cast() και disable_automatic_type_cast(). Αυτό μπορεί να είναι βολικό εάν η μεταβλητή περιβάλλοντος περιέχει ένα σειριοποιημένο αντικείμενο τύπου JSON ή ακόμα και απλώς μια σταθερά Boole (η ρητή ρύθμιση της μεταβλητής DEBUG στο Django συγκρίνοντας τη μεταβλητή περιβάλλοντος με συμβολοσειρές "έγκυρες" είναι μια από τις πιο συνηθισμένες περιπτώσεις). Αλλά τώρα δεν χρειάζεται να μετατρέψετε ρητά τις συμβολοσειρές - οι περισσότερες από τις απαραίτητες ενέργειες είναι ήδη ενσωματωμένες στα βάθη της βιβλιοθήκης και απλώς περιμένουν ένα σήμα για να ενεργήσουν. 🙂 Σε γενικές γραμμές, η πληκτρολόγηση λειτουργεί με διαφάνεια και υποστηρίζει σχεδόν όλους τους διαθέσιμους ενσωματωμένους τύπους δεδομένων (το παγωμένο σύνολο, το σύνθετο και τα byte δεν δοκιμάστηκαν).

Η απαίτηση υποστήριξης της Python 2 εφαρμόστηκε σχεδόν χωρίς θυσίες (η εγκατάλειψη της πληκτρολόγησης και μερικών από τα «ζαχαρωτά» των τελευταίων εκδόσεων της Python 3), ιδίως χάρη στις πανταχού παρούσες έξι (για την επίλυση των προβλημάτων χρήσης metaclasses ).

Υπάρχουν όμως ορισμένοι περιορισμοί:

  • Υποστήριξη Python 3 σημαίνει έκδοση 3.5 και νεότερη (η παρουσία τους στο έργο σας είναι αποτέλεσμα είτε τεμπελιάς είτε έλλειψης ανάγκης για βελτιώσεις, καθώς είναι δύσκολο να βρείτε έναν αντικειμενικό λόγο για τον οποίο είστε ακόμα στην 3.4).
  • Στην Python 2.7, η βιβλιοθήκη δεν υποστηρίζει την αποσειροποίηση των γραμμάτων συνόλου. Περιγραφή εδώ. Αλλά αν κάποιος θέλει να το εφαρμόσει, είναι ευπρόσδεκτος :);

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

βιβλιοθήκη python-shell

Τώρα θα σας πω για τη δεύτερη βιβλιοθήκη (θα παραλείψω την περιγραφή των ελλείψεων των υπαρχόντων αναλόγων - είναι παρόμοια με αυτή που περιγράφεται για το smart-env. Ανάλογα - εδώ и εδώ).

Γενικά, η ιδέα της υλοποίησης και οι απαιτήσεις για αυτήν είναι παρόμοιες με αυτές που περιγράφονται για το smart-env, όπως φαίνεται από το παράδειγμα:

from python_shell import Shell

Shell.ls('-l', '$HOME')  # Equals "ls -l $HOME"

command = Shell.whoami()  # Equals "whoami"
print(command.output)  # prints your current user name

print(command.command)  # prints "whoami"
print(command.return_code)  # prints "0"
print(command.arguments)  # prints ""

Shell.mkdir('-p', '/tmp/new_folder')  # makes a new folder

Η ιδέα είναι η εξής:

  1. Μια κλάση που αντιπροσωπεύει το Bash στον κόσμο της Python.
  2. Κάθε εντολή Bash καλείται ως συνάρτηση της κλάσης Shell.
  3. Οι παράμετροι για κάθε κλήση συνάρτησης μεταβιβάζονται στη συνέχεια στην αντίστοιχη κλήση εντολής Bash.
  4. Κάθε εντολή εκτελείται «εδώ και τώρα» τη στιγμή που καλείται, δηλ. η σύγχρονη προσέγγιση λειτουργεί.
  5. είναι δυνατή η πρόσβαση στην έξοδο μιας εντολής στο stdout, καθώς και στον κωδικό επιστροφής της.
  6. Εάν η εντολή δεν βρίσκεται στο σύστημα, δημιουργείται μια εξαίρεση.

Όπως και με το smart-env, υπάρχει υποστήριξη για Python 2 (αν και απαιτούνταν λίγο περισσότερο θυσιαστικό αίμα) και καμία υποστήριξη για Python 3.0-3.4.

Σχέδια ανάπτυξης βιβλιοθήκης

Μπορείτε να χρησιμοποιήσετε τις βιβλιοθήκες τώρα: και οι δύο δημοσιεύονται στο επίσημο PyPI. Οι πηγές είναι διαθέσιμες στο Github (δείτε παρακάτω).

Και οι δύο βιβλιοθήκες θα αναπτυχθούν λαμβάνοντας υπόψη τα σχόλια που συλλέγονται από τους ενδιαφερόμενους. Και, αν μπορεί να είναι δύσκολο να βρείτε μια ποικιλία νέων χαρακτηριστικών στο smart-env, τότε στο python-shell υπάρχει σίγουρα κάτι άλλο να προσθέσετε:

  • υποστήριξη για μη αποκλεισμούς κλήσεων.
  • δυνατότητα διαδραστικής επικοινωνίας με την ομάδα (εργασία με το stdin).
  • προσθήκη νέων ιδιοτήτων (για παράδειγμα, ιδιότητα για λήψη εξόδου από το stderr).
  • υλοποίηση ενός καταλόγου διαθέσιμων εντολών (για χρήση με τη συνάρτηση dir()).
  • κλπ.

παραπομπές

  1. βιβλιοθήκη smart-env: Github и PyPI
  2. βιβλιοθήκη python-shell: Github и PyPI
  3. Κανάλι Telegram ενημερώσεις βιβλιοθήκης

UPD23.02.2020:
* Τα αποθετήρια έχουν μετακινηθεί, οι αντίστοιχοι σύνδεσμοι έχουν ενημερωθεί
* Η έκδοση python-shell==1.0.1 ετοιμάζεται για κυκλοφορία στις 29.02.2020/XNUMX/XNUMX. Οι αλλαγές περιλαμβάνουν υποστήριξη για αυτόματη συμπλήρωση εντολών και την εντολή dir(Shell), εκτέλεση εντολών με μη έγκυρο αναγνωριστικό Python και διορθώσεις σφαλμάτων.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο