Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ONVIF-Python+;ZEEP:创建_服务不工作_Python_Wsdl_Onvif_Zeep - Fatal编程技术网

ONVIF-Python+;ZEEP:创建_服务不工作

ONVIF-Python+;ZEEP:创建_服务不工作,python,wsdl,onvif,zeep,Python,Wsdl,Onvif,Zeep,我正在使用ONVIF协议实现一个应用程序。我必须处理一个WSDL文件。但有必要定义默认服务,将以下代码添加到WSDL文件中: <wsdl:service name="DeviceService"> <wsdl:port name="DevicePort" binding="tds:DeviceBinding"> <soap:address location="http://ip_address/onvif/device_service"/&g

我正在使用ONVIF协议实现一个应用程序。我必须处理一个WSDL文件。但有必要定义默认服务,将以下代码添加到WSDL文件中:

<wsdl:service name="DeviceService">
    <wsdl:port name="DevicePort" binding="tds:DeviceBinding">
        <soap:address location="http://ip_address/onvif/device_service"/>
    </wsdl:port>
</wsdl:service>
但当我运行脚本时,会引发以下异常:

ValueError:没有定义默认服务。这通常是由于wsdl中缺少wsdl:service定义

当我直接修改WSDL文件(添加上面的节点)时,一切都正常工作

有什么想法吗?我要和一段时间打架,所以我需要踢一脚


谢谢。

服务=client.create\u service()应该可以工作(请参见相同的wsdl)


您是否将创建的服务对象用于后续调用(例如,
service.Operation()
而不是客户端?

不幸的是,它对我不起作用,但我希望:-(。在您回答后,我注意到我的Zeep版本(0.21.0),我认为这可能是因为它。但根据发布日期,它应该包含工作的create_service()方法。尽管如此,我已经更新到1.1.0,但仍然不工作-引发了相同的异常(没有定义默认服务)。对于“后续调用”,我想我是-我正在调用client.service.Operation(),可以吗?我上面写的代码正确吗(我指的是客户端和create_服务的代码)?不,这就是它实际给出错误的原因。client.service对象是一个默认映射。因为您使用create_服务创建了一个新映射,所以您需要改为使用它。因此my_service=client.create_服务(…);my_服务.operation()所以,你的建议就是答案——但是结合特定版本的Zeep。这有点奇怪,但是当我安装0.21.0到0.24.0版本的Zeep时,它工作得非常好,当我安装0.26.0和0.27.0版本的Zeep时,它只工作于X个请求中的一个(在其他X-1请求中,它抛出了一个异常,我将进一步描述)当我安装版本1.0.0和1.1.0的Zeep时,每次都会抛出一个异常:“http.client.RemoteDisconnected:Remote end closed connection without response”。因此我尝试升级每个依赖项,但没有帮助。再次感谢。
client = Client(
    wsdl = '/path/to/local/wsdl_file.wsdl',
    wsse = self.InitSecurity(),
    service_name = 'DeviceService',
    port_name = 'DevicePort'
)

service = client.create_service(
    '{http://www.onvif.org/ver10/device/wsdl}DeviceBinding',
    'http://ip_address/onvif/device_service'
)