[英]Invoking a class method from a Linux process which is a python script
Linux機器正在運行如下所示的過程:
root 18983 18961 0 02:22 pts/0 00:00:04 /xxx/grpcEnv/bin/python /xxx/python/exabgp_shim/ExaBGP_server.py
python腳本ExaBGP_server.py
基本上會啟動服務器,並在無限的while循環中等待。 該腳本還具有一些定義了不同方法的類。
題:
當進程已經在運行時,如何調用上述python腳本的類方法?
除非您在服務器中有代碼可以在運行時或啟動時訪問解釋器,否則沒有簡單的方法可以做到這一點。
編輯: 這個“人孔”庫在您的用例中看起來很有希望,盡管像列出的其他想法一樣,它確實需要對服務器代碼進行一些修改才能實現。
這是您編寫的代碼嗎? 如果是這樣,您可以對其進行修改以在后台線程中運行服務器,然后使用code
模塊在控制台上啟動具有可訪問的適當模塊/類實例(如果需要)的交互式解釋器。 這僅適用於調試,因為這可以有效地將您的非交互式服務器轉變為交互式Python進程,該進程恰巧在后台運行服務器。
Twisted庫支持基於telnet或SSH的沙井功能,實際上您可以隨時在其中運行運行中的Python進程,但是將Twisted集成到非Twisted代碼庫中對於此功能而言並不值得。 我認為這個概念還有其他實現,包括一些提供漂亮的HTML / JS接口的實現,但是我沒有方便的名稱/鏈接。
這正是DBus解決的問題。 它允許您從另一個進程調用方法。
我問了一個有關使用DBus創建Hello World服務器的問題,使用Python注冊了“ Hello World” DBus服務,對象和方法 。
這是服務器代碼的外觀:
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()
您可以使用dbus-send
來調用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.