当我尝试安装xmlrpclib时,我在python 3.4版中遇到以下错误
下载/解压缩xmlrpclib无法找到满足要求的任何下载xmlrpclib忽略了一些外部托管文件(使用--allow-external xmlrpclib允许).正在清理...找不到xmlrpclib的所有发行版在/home/shiva/.pip/pip.log中存储失败的调试日志
如何在python 3.4中安装xmlrpclib?
我有一个类,我希望使用pythons SimpleXMLRPCServer作为远程服务公开.服务器启动如下所示:
server = SimpleXMLRPCServer((serverSettings.LISTEN_IP,serverSettings.LISTEN_PORT))
service = Service()
server.register_instance(service)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
然后我有一个ServiceRemote类,如下所示:
def __init__(self,ip,port):
self.rpcClient = xmlrpclib.Server('http://%s:%d' %(ip,port))
def __getattr__(self, name):
# forward all calls to the rpc client
return getattr(self.rpcClient, name)
Run Code Online (Sandbox Code Playgroud)
因此,ServiceRemote对象上的所有调用都将转发到xmlrpclib.Server,然后将其转发到远程服务器.问题是服务中采用名为varargs的方法:
@useDb
def select(self, db, fields, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
@useDb装饰器包装函数,在调用之前创建db并打开它,然后在调用完成之后关闭它,然后返回结果.
当我调用这个方法时,我得到错误" call()得到一个意外的关键字参数'name'".那么,是否可以远程调用采用变量命名参数的方法?或者我是否必须为我需要的每个方法变体创建一个覆盖.
谢谢你的回复.我改变了我的代码,所以问题不再是问题.但是现在我知道这个以供将来参考,如果我确实需要实现位置参数并支持远程调用.我认为Thomas和praptaks方法的结合会很好.通过xmlrpclient将kwargs转换为客户端上的位置args,并在方法服务器上使用包装器来解压缩位置参数.
我正在尝试与之交互supervisord,我想通过unix socket(它是一个共享的托管环境)与它交谈.
到目前为止我尝试过的是:
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
Run Code Online (Sandbox Code Playgroud)
/path/to/supervisor.sock肯定存在.使用'unix:///path/to/supervisor.sock/RPC2'形式的URI supervisord,这是我的想法.文档不讨论unix套接字:http://docs.python.org/library/xmlrpclib.html.
这可能吗?我应该使用不同的库吗?
根据Python文档中的示例,我使用SimpleXMLRPCServer在Python中构建了一个xml-rpc服务器.我是在同一台机器上的Python客户端调用它.服务器功能的主体自己执行得非常快.
但我发现xmlrpc客户端性能极其缓慢,每次调用需要一秒钟.(使用xmlrpclib.)
我在网上找到的加速技术(跳过getfqdn解决方案)没有帮助.
我的连接URI是:
'http://localhost:50080'
Run Code Online (Sandbox Code Playgroud)
我在Windows 7上运行Python 2.7 x64,但对于32位Python 2.7,它的工作原理相同.
我有简单的xmlrpc服务器代码:
from SimpleXMLRPCServer import SimpleXMLRPCServer
port = 9999
def func():
print 'Hi!'
print x # error!
print 'Bye!'
if __name__ == '__main__':
server = SimpleXMLRPCServer(("localhost", port))
print "Listening on port %s..." % port
server.register_function(func)
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
示例会话.
客户:
>>> import xmlrpclib
>>> p = xmlrpclib.ServerProxy('http://localhost:9999')
>>> p.func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python26\lib\xmlrpclib.py", line 1199, in __call__
return self.__send(self.__name, args)
File "C:\Python26\lib\xmlrpclib.py", line 1489, in __request
verbose=self.__verbose
File "C:\Python26\lib\xmlrpclib.py", line 1253, in request
return …Run Code Online (Sandbox Code Playgroud) python multithreading simplexmlrpcserver xmlrpclib xmlrpcclient
我在使用一串使用SocketServer.ThreadingMixin的SimpleXMLRPCServers时间歇性地收到httplib.CannotSendRequest异常.
我所说的'链'是指如下:
我有一个客户端脚本,它使用xmlrpclib来调用SimpleXMLRPCServer上的函数.反过来,该服务器调用另一个SimpleXMLRPCServer.我意识到这听起来有多复杂,但是有充分的理由选择了这种架构,我没有看到它不应该成为可能的原因.
(testclient)client_script ---calls-->
(middleserver)SimpleXMLRPCServer ---calls--->
(finalserver)SimpleXMLRPCServer --- does something
Run Code Online (Sandbox Code Playgroud)
我已经能够在下面的简单测试代码中重现该问题.有三个片段:
finalserver:
import SocketServer
import time
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass
# Create server
server = AsyncXMLRPCServer(('', 9999), SimpleXMLRPCRequestHandler)
server.register_introspection_functions()
def waste_time():
time.sleep(10)
return True
server.register_function(waste_time, 'waste_time')
server.serve_forever()
Run Code Online (Sandbox Code Playgroud)
middleserver:
import SocketServer
from SimpleXMLRPCServer import SimpleXMLRPCServer
from SimpleXMLRPCServer import SimpleXMLRPCRequestHandler
import xmlrpclib
class AsyncXMLRPCServer(SocketServer.ThreadingMixIn,SimpleXMLRPCServer): pass
# Create server
server = AsyncXMLRPCServer(('', 8888), SimpleXMLRPCRequestHandler)
server.register_introspection_functions()
s = xmlrpclib.ServerProxy('http://localhost:9999')
def call_waste():
s.waste_time()
return True …Run Code Online (Sandbox Code Playgroud) 我有一个实例化xmlrpclib.ServerProxy一次的应用程序,然后将其传递给多个线程(Web应用程序请求),这些线程同时执行XML/RPC调用.这适用于python 2.6.使用python 2.7,我们在多线程环境中遇到很多错误(ResponseNotReady,CannotSendRequest).
# This code works well in python 2.6, and breaks in python 2.7.
import xmlrpclib
import thread
proxy = xmlrpclib.ServerProxy("http://localhost:5000/")
def fetch_users():
print proxy.getUsers()
for _ in range(10):
thread.start_new_thread(fetch_users, ())
while(1):
pass
Run Code Online (Sandbox Code Playgroud)
这里有什么问题,是否有一种重新使用ServerProxy对象的线程安全方法?
在 python 中,调用 XML-RPC 方法涉及调用代理对象上的方法:
from xmlrpclib import ServerProxy
print ServerProxy('https://example.com/rpc').api.hello_there('John')
Run Code Online (Sandbox Code Playgroud)
在其他一些语言中,例如 perl,您可以将方法名称作为方法参数传递。
use Frontier::Client;
$p = Frontier::Client->new(url => 'https://example.com/rpc');
$result = $p->call('api.hello_there', 'John');
print $result;
Run Code Online (Sandbox Code Playgroud)
有没有办法在 Python 中按名称(作为字符串)调用 XML-RPC 方法?
使用 Python 2.6.x 的 xmlrpclib 在客户端和服务器之间交换的消息在服务器端创建了一种“实例”类型,而不是“日期时间”类型。在客户端,我创建了一个新的
updateTime = datetime(year, month, day, hour, minute, second)
print type(updateTime)
print updateTime
Run Code Online (Sandbox Code Playgroud)
结果是
<type 'datetime.datetime'>
2015-10-07 10:21:52
Run Code Online (Sandbox Code Playgroud)
发送时,字典在客户端看起来像这样:
'updateTime': datetime.datetime(2015, 10, 7, 10, 21, 52)
Run Code Online (Sandbox Code Playgroud)
但是服务器端的传入字典是这样的:
'updateTime': <DateTime '20151007T10:21:52' at 7f4dbf4ceb90>
Run Code Online (Sandbox Code Playgroud)
打印类型及其字符串表示如下:
<type 'instance'>
20151007T10:21:52
Run Code Online (Sandbox Code Playgroud)
我们正在使用 xmlrpclib.ServerProxy 但将use_datetime更改为True或False根本没有任何区别。
xmlrpclib.ServerProxy('https://'+rpc_server_addr, allow_none=True, use_datetime=True)
Run Code Online (Sandbox Code Playgroud)
为什么会这样?我也希望接收方有一个 tpye 'datetime.datetime'。
我刚从Electrum.org的命令行安装了一个比特币钱包
继承人我如何在我的用户帐户目录中安装它../home/user/...
sudo pip3 install https://download.electrum.org/2.8.2/Electrum-2.8.2.tar.gz
Run Code Online (Sandbox Code Playgroud)
它安装没有问题.
当我尝试从命令行运行软件
electrum或如果我尝试electrum help我得到这个ImportError
(继承人的文件http://docs.electrum.org/en/latest/cmdline.html)
ImportError: No module named 'xmlrpclib'
Run Code Online (Sandbox Code Playgroud)
如果你试图复制它,那就是追溯
File "/usr/local/bin/electrum", line 71, in check_imports
import jsonrpclib
File "/usr/local/lib/python3.5/dist-packages/jsonrpclib/__init__.py", line 5, in <module>
from jsonrpclib.jsonrpc import Server, MultiCall, Fault
File "/usr/local/lib/python3.5/dist-packages/jsonrpclib/jsonrpc.py", line 50, in <module>
from xmlrpclib import Transport as XMLTrasnport
Run Code Online (Sandbox Code Playgroud)
我已经做好了
sudo apt-get update
sudo apt-get upgrade
sudo pip install xmlrpclib
但没有用.
如果有人能够提供一些非常感激的见解.
python ×10
xmlrpclib ×10
xml-rpc ×6
python-2.7 ×2
xmlrpcclient ×2
call ×1
datetime ×1
getattr ×1
httplib ×1
python-3.4 ×1
unix-socket ×1