【问题标题】:Invoking a class method from a Linux process which is a python script从一个 Python 脚本的 Linux 进程调用类方法
【发布时间】:2016-04-07 08:16:29
【问题描述】:

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脚本的类方法?

【问题讨论】:

  • 让脚本为你执行。
  • @sashoalm:很抱歉,这个评论似乎太挑剔了。
  • 好的,很抱歉。您能否提供 ExaBGP_server.py 的实际代码?另外,您能否提供一个示例来说明您打算如何“调用方法”? 从哪里调用它

标签: python linux class methods process


【解决方案1】:

没有简单的方法可以做到这一点,除非您在服务器中有代码让您在解释器运行或启动时也可以访问它。

编辑:This "manhole" library 看起来很适合您的用例,尽管与列出的其他想法一样,它确实需要对服务器代码进行一些修改才能实现。

这段代码是你写的吗?如果是这样,您可以修改它以在后台线程中运行服务器,然后使用code 模块在控制台上启动交互式解释器,并可以访问适当的模块/类实例(如果需要)。这仅适用于调试,因为这有效地将您的非交互式服务器变成了一个交互式 Python 进程,该进程恰好在后台运行服务器。

Twisted 库支持基于 telnet 或 SSH 的 manhole 功能,您基本上可以随时进入运行中的 Python 进程,但是将 Twisted 集成到非 Twisted 代码库中并不值得为这个功能而烦恼.我认为这个概念还有其他实现,包括一些提供花哨的 HTML/JS 接口的实现,但我没有方便的名称/链接。

【讨论】:

    【解决方案2】:

    这正是 DBus 解决的问题。它允许您从另一个进程调用方法。

    我曾问过一个关于使用 DBus 创建 Hello World 服务器的问题,Register a "Hello World" DBus service, object and method using Python

    这是服务器代码的外观:

    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来调用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 2019-10-27
      • 2016-04-19
      • 2022-10-18
      • 2012-07-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多