我正在尝试与 supervisord
交互,我想通过 unix 套接字(它是一个共享的托管环境)与它交谈。
到目前为止我尝试过的是:
import xmlrpclib
server = xmlrpclib.ServerProxy('unix:///path/to/supervisor.sock/RPC2')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python2.7/xmlrpclib.py", line 1549, in __init__
raise IOError, "unsupported XML-RPC protocol"
IOError: unsupported XML-RPC protocol
/path/to/supervisor.sock
肯定存在。 supervisord
使用 'unix:///path/to/supervisor.sock/RPC2' 形式的 URI,这就是我的灵感来源。文档不讨论 unix 套接字:http://docs.python.org/library/xmlrpclib.html .
这可能吗?我应该使用不同的库吗?
最佳答案
xmlrpclib
要求传递的 url 以 http
或 https
开头。解决这个问题的方法是定义一个忽略该 url 的自定义传输。这是一些使用主管传输的代码:
import supervisor.xmlrpc
import xmlrpclib
proxy = xmlrpclib.ServerProxy('http://127.0.0.1',
transport=supervisor.xmlrpc.SupervisorTransport(
None, None, serverurl='unix://'+socketpath))
proxy.supervisor.getState()
如果这没有用,这里是找到的代码的更新版本 here :
class UnixStreamHTTPConnection(httplib.HTTPConnection, object):
def __init__(self, *args, **kwargs):
self.socketpath = kwargs.pop('socketpath')
super(UnixStreamHTTPConnection, self).__init__(*args, **kwargs)
def connect(self):
self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
self.sock.connect_ex(self.socketpath)
class UnixStreamTransport(xmlrpclib.Transport, object):
def __init__(self, *args, **kwargs):
self.socketpath = kwargs.pop('socketpath')
super(UnixStreamTransport, self).__init__(*args, **kwargs)
关于python - 将 Python xmlrpclib 与 unix 域套接字一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11729159/