Repl/CLI im Hintergrund starten und Befehle eingeben

Repl/CLI im Hintergrund starten und Befehle eingeben

Angenommen, das pythonStarten des Repl dauert lange. Gibt es eine Möglichkeit, es im Hintergrund zu starten, sodass ich einen Alias ​​erstellen und ihm Befehle wie diese zuführen kann python-current "command to run"?

Antwort1

In der Python-Distribution gibt es keine Möglichkeit für diese Art der Öffnung, ungeachtet der Angabe „Batterien im Lieferumfang enthalten“.

Dass Programme wie Editoren mit solchen Dingen umgehen können, liegt daran, dass es ziemlich klar ist, was zu tun ist, wenn Sie eine andere Datei öffnen: Sie öffnen einfach ein Fenster/eine Registerkarte für die neue Datei, die von derselben ausführbaren Datei verwaltet wird.

So etwas selbst umzusetzen ist nicht allzu schwer, allerdings muss man sich überlegen, was passiert, wenn der erste Befehl noch nicht beendet ist und der zweite ansteht:

  • den ersten Befehl abbrechen
  • den zweiten Befehl in die Warteschlange stellen
  • Dinge parallel ausführen (was zusätzliche Startzeit erfordert, es sei denn, Sie haben mehrere Threads, die auf Befehle warten)

Ich habe laufende Pythons angewiesen, Module basierend auf Dateien in einem Verzeichnis zu laden und auszuführen, die gescannt wurden, HTTP-Anfragen (auf einem Twisted-basierten System) und mit Zeromq. Was angemessen ist, hängt meiner Meinung nach davon ab, was das System sonst noch benötigt. Ich wähle immer das, was funktioniert und den geringsten Overhead hat. Sie python-currentmüssten die richtige Schnittstelle herstellen.

Oftmals wurde dies mit dem Neuladen bestimmter Module kombiniert (um die Verarbeitung für neue Befehle zu erhalten). Dafür können Sie das reload()eingebaute verwenden:

import mycommand
# test for a command that requires reloading
reload(mycommand)


Nebenbei bemerkt: Besonders bei der Verwendung von UI-Code habe ich dieses Neuladen als nützlich empfunden. Das Laden der ausführbaren Datei in Python ist mit dem von Perl vergleichbar (0,002 s auf meinem mehrere Jahre alten System time python -v). Das Laden der Basismodule dauert etwa zehnmal länger ( time python -c "exit();", 0.025s). But when using UI based programs the whole startup easily grows to several seconds and more. And in that case implementing dynamic command reading and having apython-current` macht Sinn).

Antwort2

Wenn Sie verwenden, bashkönnten Sie versuchenKoprozesse. Ksh hat auchKoprozesse, ich bin nicht sicher, ob beide Shells in diesem Bereich gleichwertige Funktionen haben. Ich habe nur die Ksh-Version ausprobiert (mein Arbeitgeber liebt Klunk, also haben wir Ksh verwendet) und es hat funktioniert, aber es war nicht einfach, mehr als einen einzigen Coprozess zu haben.

Googlen Sie nach „ksh coprocess example“ oder „bash coprocess example“ und Sie werden Beispielcode finden. Arbeiten Sie mit den Beispielen, da das Ganze nicht besonders intuitiv ist.

verwandte Informationen