2016-04-07 1 views
0

Der Linux-Rechner ein Verfahren unten wie angegeben ausgeführt wird:eine Klassenmethode von einem Linux-Prozess aufrufen, die ein Python-Skript ist

root  18983 18961 0 02:22 pts/0 00:00:04 /xxx/grpcEnv/bin/python /xxx/python/exabgp_shim/ExaBGP_server.py 

Das Python-Skript ExaBGP_server.py im Grunde ein Server gestartet und wird in einer Endlos-while-Schleife wartet . Das Skript hat auch einige Klassen mit verschiedenen Methoden definiert.

Frage:

Wie eine Klassenmethode des obigen Python-Skript aufgerufen werden, wenn der Prozess bereits ausgeführt wird?

+0

Bitten Sie das Skript, es für Sie auszuführen. –

+0

@ashoalm: Es tut mir leid, aber der Kommentar scheint zu kritisch. –

+0

OK, tut mir leid. Könnten Sie bitte den tatsächlichen Code von ExaBGP_server.py zur Verfügung stellen? Könnten Sie auch ein Beispiel dafür geben, wie Sie "eine Methode aufrufen" möchten? Aufrufen ** von wo **? – sashoalm

Antwort

1

Es gibt keine einfache Möglichkeit, dies zu tun, es sei denn, Sie haben Code auf dem Server, um Ihnen während des Betriebs oder beim Starten des Interpreters Zugriff auf einen Interpreter zu gewähren.

EDIT: This "manhole" library sieht vielversprechend für Ihren Anwendungsfall, obwohl wie die anderen aufgeführten Ideen erfordert es einige Änderungen des Server-Codes zu implementieren.

Haben Sie diesen Code geschrieben? Wenn dies der Fall ist, können Sie es so ändern, dass der Server in einem Hintergrundthread ausgeführt wird. Verwenden Sie dann das Modul code, um einen interaktiven Interpreter auf der Konsole mit den entsprechenden Modulen/Klasseninstanzen (falls erforderlich) aufzurufen. Dies funktioniert nur beim Debuggen, da dies Ihren nicht interaktiven Server in einen interaktiven Python-Prozess verwandelt, bei dem ein Server im Hintergrund ausgeführt wird.

Die Twisted-Bibliothek unterstützt ein Telnet- oder SSH-basiertes manhole-Feature, mit dem Sie jederzeit in den laufenden Python-Prozess einsteigen können. Die Integration von Twisted in eine nicht verdrehte Codebasis ist jedoch nicht die Mühe wert. Ich denke, es gab andere Implementierungen dieses Konzepts, einschließlich einiger, die schicke HTML/JS-Schnittstellen bieten, aber ich habe die Namen/Links nicht griffbereit.

1

Das ist genau das Problem, das DBus löst. Es ermöglicht Ihnen, Methoden aus einem anderen Prozess aufzurufen.

Ich hatte eine Frage zum Erstellen Hello World Server mit DBus, Register a "Hello World" DBus service, object and method using Python.

Dies ist, wie der Code für den Server sucht:

import gobject 
import dbus 
import dbus.service 

from dbus.mainloop.glib import DBusGMainLoop 
DBusGMainLoop(set_as_default=True) 


OPATH = "/com/example/HelloWorld" 
IFACE = "com.example.HelloWorld" 
BUS_NAME = "com.example.HelloWorld" 


class Example(dbus.service.Object): 
    def __init__(self): 
     bus = dbus.SessionBus() 
     bus.request_name(BUS_NAME) 
     bus_name = dbus.service.BusName(BUS_NAME, bus=bus) 
     dbus.service.Object.__init__(self, bus_name, OPATH) 

    @dbus.service.method(dbus_interface=IFACE + ".SayHello", 
         in_signature="", out_signature="") 
    def SayHello(self): 
     print "hello, world" 


if __name__ == "__main__": 
    a = Example() 
    loop = gobject.MainLoop() 
    loop.run() 

Und Sie können dbus-send es nennen verwenden.

Verwandte Themen