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脚本的类方法?
发布于 2016-04-07 08:24:12
要做到这一点没有简单的方法,除非您在服务器中有代码,使您可以在解释器运行时或启动时访问解释器。
编辑:This "manhole" library看起来很适合您的用例,尽管像列出的其他想法一样,它确实需要对服务器代码进行一些修改才能实现。
这是你写的代码吗?如果是这样,您可以修改它以在后台线程中运行服务器,然后使用code
模块在控制台上启动交互式解释器,并且可以访问适当的模块/类实例(如果需要)。这只适用于调试,因为这会有效地将非交互式服务器转换为交互式Python进程,该进程恰好在后台运行服务器。
Twisted库支持telnet或基于SSH的manhole特性,在这种特性中,您基本上可以在任何时候外壳到正在运行的Python进程中,但是将Twisted集成到非Twisted代码库中不值得为此特性而麻烦。我认为这个概念还有其他实现,包括一些提供了奇特的HTML/JS接口的实现,但是我手头没有这些名称/链接。
发布于 2016-04-07 09:34:32
这正是DBus解决的问题。它允许您从另一个流程调用方法。
我问了一个关于使用DBus、Register a "Hello World" DBus service, object and method using Python创建Hello World服务器的问题。
服务器的代码如下所示:
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
来调用它。
https://stackoverflow.com/questions/36470424
复制相似问题