Guten Tag allerseits.
Heutzutage ist Python eine der am hĂ€ufigsten verwendeten Programmiersprachen, nicht nur zur Erstellung von Softwareprodukten, sondern auch zur Bereitstellung der Infrastruktur dafĂŒr. Deshalb mussten viele DevOps, ob sie wollten oder nicht, eine neue Sprache erlernen, um sie als ErgĂ€nzung zu den altbewĂ€hrten Bash-Skripten zu nutzen. Bash und Python haben jedoch unterschiedliche AnsĂ€tze zum Codieren und bestimmte Besonderheiten, weshalb die Portierung von Bash-Skripten auf die "Schlangensprache" manchmal eine umfangreiche und keinesfalls triviale Aufgabe darstellt.
Um DevOps das Leben zu erleichtern, wurden und werden viele nĂŒtzliche Bibliotheken und Tools in Python entwickelt. Dieser Artikel beschreibt gleich zwei neue Bibliotheken, die vom Autor dieses Beitrags erstellt wurden â und â und die dazu dienen, DevOps von der Notwendigkeit zu befreien, viel Aufmerksamkeit den Feinheiten der Python-Arbeit zu widmen, und stattdessen Platz fĂŒr interessantere Aufgaben zu schaffen. Der Anwendungsbereich der Bibliotheken sind Umgebungsvariablen und das Starten externer Tools.
Wer Interesse hat, bitte weiterlesen.
Neue "FahrrÀder"?
Es stellt sich die Frage, warum man neue Pakete fĂŒr recht alltĂ€gliche Operationen erstellen sollte. Was hindert daran, direkt os.environ und subprocess. zu verwenden?
Die Beweise fĂŒr jede der Bibliotheken werde ich separat auffĂŒhren.
Die Bibliothek smart-env.
Bevor man sein eigenes Werk schreibt, ist es nĂŒtzlich, das Internet zu durchforsten und nach bestehenden Lösungen zu suchen. NatĂŒrlich besteht das Risiko, dass man nicht findet, was man braucht, aber das ist eher ein "Versicherungsfall". In der Regel funktioniert der Ansatz und spart eine Menge Zeit und MĂŒhe.
Laut den Ergebnissen Folgendes wurde festgestellt:
- Es gibt Pakete, die tatsÀchlich die Aufrufe an os.environ kapseln, dabei jedoch eine Menge ablenkender Aktionen erfordern (Erstellung einer Klasseninstanz, spezielle Parameter in Aufrufen usw.);
- Es gibt anstĂ€ndige Pakete, die jedoch stark an ein bestimmtes Ăkosystem (hauptsĂ€chlich an Web-Frameworks wie Django) gebunden sind und deshalb ohne Nachbearbeitung nicht wirklich universell sind;
- Es gibt seltene Versuche, etwas Neues zu schaffen. Zum Beispiel, und die Werte von Variablen durch Methodenaufrufe wie
get_(var_name)Oder hier ist , die jedoch derzeit das heutzutage nicht mehr beliebte Python 2 nicht unterstĂŒtzt (auf dem, trotz der , es bleibt immer noch eine Menge geschriebenen Codes und ganze Ăkosysteme);
- es gibt Schul- und Studentenprojekte, die ĂŒberhaupt nicht klar sind, warum sie im upstream PyPI gelandet sind und nur Probleme bei der Benennung neuer Pakete verursachen (insbesondere der Name âsmart-envâ â eine erzwungene MaĂnahme).
Und diese Liste könnte lange fortgesetzt werden. Aber die oben genannten Punkte reichen aus, um die Idee zu entfachen, etwas Bequemes und Universelles zu schaffen.
Die Anforderungen, die beim Schreiben von smart-env gestellt wurden:
- Maximal einfaches Nutzungsschema
- Einfach konfigurierbare UnterstĂŒtzung der Datentypisierung
- KompatibilitÀt mit Python 2.7
- Gute Testabdeckung des Codes
Letztendlich ist es gelungen, all dies umzusetzen. Hier ist ein Beispiel fĂŒr die Verwendung:
from smart_env import ENV
print(ENV.HOME) # Entspricht print(os.environ['HOME'])
# vorausgesetzt, Sie haben die Umgebungsvariable MYVAR auf "True" gesetzt
ENV.enable_automatic_type_cast()
my_var = ENV.MY_VAR # Entspricht boolean True
ENV.NEW_VAR = 100 # Setzt eine neue Umgebungsvariable
Wie im Beispiel zu sehen ist, reicht es aus, die neue Klasse zu importieren (eine Instanz muss nicht erstellt werden â das spart unnötige Aktionen). Der Zugang zu jeder Umgebungsvariable erfolgt durch den Zugriff auf sie als Klasseneigenschaft ENV, was diesen Klasse im Grunde zu einer intuitiv verstĂ€ndlichen Wrapper des nativen Systemumfelds macht und es gleichzeitig zu einer möglichen Konfigurationsobjekt-Option fĂŒr so gut wie jedes System erhebt (ein Ă€hnlicher Ansatz wird beispielsweise in Django verfolgt, wo das Konfigurationsobjekt das Modul/Paket settings ist).
Die Aktivierung/Deaktivierung des automatischen Typumwandlungsmodus erfolgt durch die Verwendung von zwei Methoden â enable_automatic_type_cast() und disable_automatic_type_cast(). Dies kann nĂŒtzlich sein, wenn in der Umgebungsvariablen ein serialisiertes JSON-Ă€hnliches Objekt oder sogar einfach eine boolesche Konstante liegt (eine hĂ€ufige Praxis ist die explizite Definition der DEBUG-Variablen in Django durch den Vergleich der Umgebungsvariablen mit "gĂŒltigen" Zeichenfolgen). Aber nun ist es nicht mehr notwendig, Zeichenfolgen explizit zu konvertieren â die meisten erforderlichen Aktionen sind bereits in die Bibliothek integriert und warten nur auf das Signal zum Handeln. đ Insgesamt funktioniert die Typisierung transparent und unterstĂŒtzt fast alle gĂ€ngigen eingebauten Datentypen (frozenset, complex und bytes wurden nicht getestet).
Die Anforderung zur UnterstĂŒtzung von Python 2 wurde nahezu ohne Opfer umgesetzt (Verzicht auf typing und einige âZuckerpillenâ der letzten Python-3-Versionen), insbesondere dank des allgegenwĂ€rtigen six (zur Lösung von Problemen mit Metaklassen).
Es gibt jedoch auch einige EinschrÀnkungen:
- Die UnterstĂŒtzung von Python 3 umfasst Version 3.5 und höher (das Vorhandensein in Ihrem Projekt ist entweder ein Zeichen von Faulheit oder der Mangel an Notwendigkeit fĂŒr Verbesserungen, da es schwer ist, einen objektiven Grund zu finden, warum Sie immer noch auf 3.4 sitzen);
- In Python 2.7 unterstĂŒtzt die Bibliothek keine Deserialisierung von Set-Literalen. Beschreibung . Aber wenn jemand es implementieren möchte â willkommen:);
Die Bibliothek verwendet auch einen Ausnahmemechanismus fĂŒr Parsing-Fehler. Wenn eine Zeile von keinem der vorhandenen Parser erkannt werden kann, bleibt der Wert als String (mehr aus GrĂŒnden der Bequemlichkeit und der AbwĂ€rtskompatibilitĂ€t zur gewohnten Variablenlogik in Bash).
Die Bibliothek python-shell.
Nun erzĂ€hle ich von der zweiten Bibliothek (die Beschreibung der MĂ€ngel der vorhandenen Alternativen lasse ich weg â sie Ă€hnelt der fĂŒr smart-env. Alternativen â und ).
Insgesamt sind die Ideen fĂŒr die Implementierung und die Anforderungen daran Ă€hnlich wie die fĂŒr smart-env beschriebenen, was aus dem Beispiel ersichtlich ist:
from python_shell import Shell
Shell.ls('-l', '$HOME') # Entspricht "ls -l $HOME"
command = Shell.whoami() # Entspricht "whoami"
print(command.output) # gibt Ihren aktuellen Benutzernamen aus
print(command.command) # gibt "whoami" aus
print(command.return_code) # gibt "0" aus
print(command.arguments) # gibt "" aus
Shell.mkdir('-p', '/tmp/new_folder') # erstellt einen neuen Ordner
Die Idee ist folgende:
- Eine einheitliche Klasse, die Bash in der Python-Welt verkörpert;
- Jeder Bash-Befehl wird als Funktion der Klasse Shell aufgerufen;
- Die Parameter des Aufrufs jeder Funktion werden an den entsprechenden Bash-Befehl weitergegeben;
- Jeder Befehl wird "hier und jetzt" zum Zeitpunkt seines Aufrufs ausgefĂŒhrt, d.h. es wird ein synchroner Ansatz verfolgt;
- Es besteht die Möglichkeit, den Ausgabeinhalt des Befehls im stdout sowie den RĂŒckgabecode zu erhalten;
- Wenn der Befehl im System fehlt, wird eine Ausnahme ausgelöst.
Wie bereits bei smart-env gewĂ€hrleistet, wird Python 2 unterstĂŒtzt (obwohl dafĂŒr etwas mehr Opfertum benötigt wurde) und es wird kein Support fĂŒr Python 3.0-3.4 angeboten.
EntwicklungsplĂ€ne fĂŒr die Bibliotheken
Die Bibliotheken können bereits jetzt verwendet werden: Beide sind auf dem offiziellen PyPI verfĂŒgbar. Quellcodes sind auf Github verfĂŒgbar (siehe unten).
Beide Bibliotheken werden unter BerĂŒcksichtigung des Feedbacks weiterentwickelt, das von Interessierten gesammelt wurde. WĂ€hrend es in smart-env vielleicht schwer ist, eine Vielzahl neuer Features zu finden, gibt es im python-shell definitiv noch viel hinzuzufĂŒgen:
- UnterstĂŒtzung fĂŒr nicht-blockierende Aufrufe;
- Möglichkeit zur interaktiven Kommunikation mit dem Befehl (Arbeiten mit stdin);
- HinzufĂŒgen neuer Eigenschaften (z.B. eine Eigenschaft, um die Ausgabe aus stderr zu erhalten);
- Implementierung des Verzeichnisses verfĂŒgbarer Befehle (zur Verwendung mit der Funktion dir());
- usw.
Links
- Bibliothek smart-env: und
- Bibliothek python-shell: und
- Bibliotheksaktualisierungen
UPD 23.02.2020:
* Repositories wurden verschoben, die entsprechenden Links wurden aktualisiert
* Die Version python-shell==1.0.1 wird am 29.02.2020 veröffentlicht. Zu den Ănderungen gehören die UnterstĂŒtzung der automatischen VervollstĂ€ndigung von Befehlen und der Befehl dir(Shell), die AusfĂŒhrung von Befehlen mit ungĂŒltigen Python-Identifikatoren sowie Fehlerbehebungen.
Quelle: habr.com
