Wir machen Python- und Bash-Freunde: Smart-Env- und Python-Shell-Bibliotheken

Guten Tag allerseits.

Heute ist Python eine der am häufigsten verwendeten Sprachen im Bereich der Erstellung nicht nur direkter Softwareprodukte, sondern auch der Bereitstellung ihrer Infrastruktur. Infolgedessen mussten viele Entwickler nach ihrem Willen oder gegen ihn eine neue Sprache lernen, um sie später als Ergänzung zu den guten alten Bash-Skripten zu verwenden. Bash und Python bekennen sich jedoch zu unterschiedlichen Ansätzen beim Schreiben von Code und verfügen über bestimmte Funktionen, mit denen das Portieren von Bash-Skripten in die "Schlangensprache" manchmal umfangreich und alles andere als trivial ist.

Um Entwicklern das Leben zu erleichtern, wurden viele nützliche Bibliotheken und Dienstprogramme in Python erstellt und werden weiterhin erstellt. Dieser Artikel beschreibt sofort zwei neue Bibliotheken, die vom Autor dieses Beitrags erstellt wurden - smart-envund Python-Shell - und entwickelt, um die Entwickler vor der Notwendigkeit zu bewahren, den Feinheiten der Arbeit mit Python viel Aufmerksamkeit zu schenken und Raum für interessantere Aufgaben zu lassen. Der Umfang der Bibliothek umfasst Umgebungsvariablen und den Start externer Dienstprogramme.

Wer interessiert sich bitte unter der Katze.

Neue Fahrräder?


Es scheint, warum neue Pakete für ziemlich weltliche Operationen erstellen? Was verhindert die direkte Verwendung von os.environ und Unterprozessen. <Methode oder Klasse Ihrer Wahl>?

Ich werde für jede der Bibliotheken separat aussagen.

Smart-env-Bibliothek


Bevor Sie Ihre eigene Idee schreiben, ist es hilfreich, im Internet zu surfen und nach vorgefertigten Lösungen zu suchen. Natürlich besteht die Gefahr, dass Sie nicht finden, was Sie brauchen, sondern dass es sich um einen "Versicherungsfall" handelt. In der Regel funktioniert der Ansatz und spart viel Zeit und Mühe.

Den Suchergebnissen zufolge wurde Folgendes festgestellt:

  • Es gibt Pakete, die Aufrufe an os.environ tatsächlich umbrechen, aber gleichzeitig eine Reihe von ablenkenden Aktionen erfordern (Erstellen einer Instanz der Klasse, spezielle Parameter in Aufrufen usw.).
  • Es gibt gute Pakete, die jedoch eng an ein bestimmtes Ökosystem gebunden sind (hauptsächlich Web-Frameworks wie Django) und daher ohne Datei nicht universell sind.
  • Es gibt seltene Versuche, etwas Neues zu machen. Fügen Sie beispielsweise Typisierung hinzu und analysieren Sie Variablenwerte explizit, indem Sie Methoden des Formulars aufrufen

    get_<typename>(var_name)

    Oder hier ist eine andere Lösung , die derzeit jedoch nicht in Ungnade gefallenes Python 2 unterstützt (auf dem es trotz des offiziellen RIP immer noch Berge von geschriebenem Code und ganze Ökosysteme gibt).
  • Es gibt Schülerhandwerk, es ist überhaupt nicht klar, warum sie im vorgelagerten PyPI gelandet sind und nur Probleme bei der Benennung neuer Pakete verursachen (insbesondere der Name "smart-env" ist eine notwendige Maßnahme).

Und die Liste geht weiter und weiter. Die obigen Punkte reichten jedoch aus, um auf die Idee zu kommen, etwas Bequemes und Universelles zu schaffen.

Anforderungen an smart-env:

  • Das einfachste Verwendungsschema
  • Einfach konfigurierbare Unterstützung für die Datentypisierung
  • Python 2.7 kompatibel
  • Gute Testabdeckung

Am Ende wurde all dies realisiert. Hier ist ein Anwendungsbeispiel:

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

Wie Sie dem Beispiel entnehmen können, reicht es aus, die neue Klasse zu importieren, um mit ihr zu arbeiten (Sie müssen keine Instanz erstellen - abzüglich der zusätzlichen Aktion). Der Zugriff auf jede Umgebungsvariable wird erreicht, indem sie als ENV-Klassenvariable bezeichnet wird. Dies macht diese Klasse zu einem intuitiven Wrapper für die native Systemumgebung und macht sie gleichzeitig zu einer möglichen Variante des Konfigurationsobjekts fast aller Systeme (ein ähnlicher Ansatz wird beispielsweise in Django erreicht , nur dort ist das Konfigurationsobjekt direkt das Modul / Einstellungspaket).

Das Aktivieren / Deaktivieren des automatischen Tippunterstützungsmodus erfolgt mit zwei Methoden: enable_automatic_type_cast () und disable_automatic_type_cast (). Dies kann praktisch sein, wenn die Umgebungsvariable ein serialisiertes JSON-ähnliches Objekt oder auch nur eine Boolesche Konstante enthält (das explizite Festlegen der DEBUG-Variablen in Django durch Vergleichen der Umgebungsvariablen mit "gültigen" Zeichenfolgen ist einer der häufigsten Fälle). Jetzt müssen die Zeilen nicht mehr explizit konvertiert werden - die meisten erforderlichen Aktionen sind bereits in den Darm der Bibliothek eingebettet und warten nur auf ein Signal zum Handeln. :) Im Allgemeinen funktioniert die Eingabe transparent und unterstützt fast alle verfügbaren integrierten Datentypen (Frozenset, Komplex und Bytes wurden nicht getestet).

Die Unterstützungsanforderung für Python 2 wurde praktisch ohne Einbußen (Verzicht auf die Eingabe und einige Kandiszucker in neueren Versionen von Python 3) implementiert, insbesondere dank der allgegenwärtigen Sechs (um die Probleme bei der Verwendung von Metaklassen zu lösen).

Es gibt jedoch einige Einschränkungen:

  • Die Unterstützung von Python 3 setzt Version 3.5 und höher voraus (ihre Präsenz in Ihrem Projekt ist entweder auf Faulheit oder auf mangelnden Verbesserungsbedarf zurückzuführen, da es schwierig ist, einen objektiven Grund zu finden, warum Sie immer noch auf 3.4 sitzen).
  • In Python 2.7 unterstützt die Bibliothek die Deserialisierung von Set-Literalen nicht. Beschreibung hier . Aber wenn jemand implementieren will - willkommen :);

Die Bibliothek bekennt sich auch zu einem Ausnahmemechanismus bei Analysefehlern. Wenn eine Zeichenfolge von keinem der verfügbaren Analysatoren erkannt werden konnte, bleibt der Wert eine Zeichenfolge (aus Gründen der Benutzerfreundlichkeit und Abwärtskompatibilität mit der üblichen Logik von Variablen in Bash).

Python-Shell-Bibliothek


Jetzt werde ich über die zweite Bibliothek sprechen (ich werde die Beschreibung der Mängel der verfügbaren Analoga weglassen - sie ähnelt der für smart-env. Analogs beschriebenen - hier und hier ).

Im Allgemeinen ähneln die Idee der Implementierung und die Anforderungen dafür denen, die für smart-env beschrieben wurden, wie aus dem Beispiel ersichtlich ist:

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

Die Idee ist folgende:

  1. Eine einzelne Klasse, die Bash in der Python-Welt darstellt.
  2. Jeder Bash-Befehl wird als Funktion der Shell-Klasse aufgerufen.
  3. Die Aufrufparameter jeder Funktion werden dann an den Aufruf an den entsprechenden Bash-Befehl weitergeleitet.
  4. Jeder Befehl wird "hier und jetzt" zum Zeitpunkt seines Aufrufs ausgeführt, d.h. arbeitet synchron Ansatz;
  5. Es ist möglich, auf den Auspuffbefehl in stdout sowie auf seinen Rückkehrcode zuzugreifen.
  6. Wenn der Befehl im System fehlt, wird eine Ausnahme ausgelöst.

Wie bei smart-env wird Python 2 unterstützt (obwohl etwas mehr Opferblut benötigt wurde), und Python 3.0-3.4 wird nicht unterstützt.

Bibliotheksentwicklungspläne


Sie können die Bibliotheken jetzt verwenden: Beide sind auf dem offiziellen PyPI angeordnet. Quellen sind auf Github verfügbar (siehe unten).

Beide Bibliotheken werden unter Berücksichtigung des Feedbacks der Interessenten entwickelt. Und wenn es in smart-env schwierig sein kann, eine Vielzahl neuer Funktionen zu entwickeln, gibt es in der Python-Shell definitiv noch etwas hinzuzufügen:

  • Unterstützung für nicht blockierende Anrufe;
  • die Möglichkeit der interaktiven Kommunikation mit dem Team (Arbeit mit stdin);
  • Hinzufügen neuer Eigenschaften (z. B. Eigenschaft, um Abgase von stderr zu erhalten);
  • Implementierung des Katalogs verfügbarer Befehle (zur Verwendung mit der Funktion dir ());
  • usw.

Verweise


  1. Smart-env-Bibliothek: Github und PyPI
  2. Python-Shell-Bibliothek: Github und Pypi
  3. Telegrammkanal für Bibliotheksaktualisierungen


UPD 23.02.2020:
* Repositorys wurden verschoben, die entsprechenden Links wurden aktualisiert.
* Die Python-Shell-Version == 1.0.1 wird für die Veröffentlichung am 29.02.2020 vorbereitet. Zu den Änderungen gehören die Unterstützung der automatischen Vervollständigung von Befehlen und des Befehls dir (Shell), das Starten von Befehlen mit einer ungültigen Python-Kennung sowie Fehlerbehebungen.

UPD 03/01/2020:
* Post bei der nächsten Veröffentlichung.

All Articles