簡體   English   中英

從Linux進程(它是python腳本)調用類方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM