首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Python xmlrpclib与unix域套接字一起使用?

将Python xmlrpclib与unix域套接字一起使用?
EN

Stack Overflow用户
提问于 2012-07-31 04:34:22
回答 4查看 8.1K关注 0票数 12

我正在尝试与supervisord交互,并且我想通过unix套接字(它是一个共享主机环境)与它对话。

到目前为止,我尝试的是:

代码语言:javascript
复制
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

这个是可能的吗?我应该使用不同的库吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-01 01:47:49

xmlrpclib要求传递的url以httphttps开头。绕过这一点的方法是定义一个忽略该url的自定义传输。下面是一些使用supervisor传输的代码:

代码语言:javascript
复制
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代码的更新版本

代码语言:javascript
复制
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)
票数 17
EN

Stack Overflow用户

发布于 2018-07-17 17:00:02

我的python3版本,是从上面的版本准备的。

代码语言:javascript
复制
from http.client import HTTPConnection
import socket
from xmlrpc import client

class UnixStreamHTTPConnection(HTTPConnection):
    def connect(self):
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.sock.connect(self.host)

class UnixStreamTransport(client.Transport, object):
    def __init__(self, socket_path):
        self.socket_path = socket_path
        super(UnixStreamTransport, self).__init__()

    def make_connection(self, host):
        return UnixStreamHTTPConnection(self.socket_path)

proxy = client.ServerProxy('http://localhost', transport=UnixStreamTransport("/var/run/supervisor.sock"))

print(proxy.supervisor.getState())
票数 8
EN

Stack Overflow用户

发布于 2014-05-24 03:32:45

下面是使用xmlrpclib与supervisor对话的更新示例:

代码语言:javascript
复制
import httplib
import socket
import xmlrpclib

class UnixStreamHTTPConnection(httplib.HTTPConnection):
    def connect(self):
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.sock.connect(self.host)

class UnixStreamTransport(xmlrpclib.Transport, object):
    def __init__(self, socket_path):
        self.socket_path = socket_path
        super(UnixStreamTransport, self).__init__()

    def make_connection(self, host):
        return UnixStreamHTTPConnection(self.socket_path)


server = xmlrpclib.Server('http://arg_unused', transport=UnixStreamTransport("/var/run/supervisor.sock"))
print(server.supervisor.getState())

如前所述,我们必须使用http://或https://指定一个虚拟url,然后指定一个自定义传输来处理域套接字

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11729159

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档