Python使用Spyne框架时触发SyntaxError错误,求解决方案
看起来你碰到了Spyne与Python版本不兼容的问题,我来帮你拆解一下:
问题回顾
你编写的SOAP服务代码逻辑本身没问题,但运行时触发了语法错误,错误指向Spyne库内部的参数写法。
你的代码
#!/usr/bin/env python from spyne import Application, rpc, ServiceBase, Unicode from lxml import etree from spyne.protocol.soap import Soap11 from spyne.server.wsgi import WsgiApplication # Wsgi это Web server Getewap Interface - стандар взаимодействия с питон программой и серверо где он работает class Soap(ServiceBase): @rpc(Unicode, _return=Unicode) def Insoap(ctx, words): print("Connection detected: ", etree.tostring(ctx.in_document)) ww = str(words).capitalize() return ww app = Application([Soap], tns='Capitalize', in_protocol=Soap11(validator='lxml'), out_protocol=Soap11()) application = WsgiApplication(app) # Важна названия переменной, иначе сервер не поймет if __name__ == '__main__': from wsgiref.simple_server import make_server server = make_server('localhost', 8002, application) server.serve_forever()
报错信息
Traceback (most recent call last): File "C:/Users/David374/PycharmProjects/untitled8/venv/test.py", line 3, in <module> from spyne import Application, rpc, ServiceBase, Iterable, UnsignedInteger, \ File "C:\Users\David374\PycharmProjects\untitled8\venv\lib\site-packages\spyne\__init__.py", line 63, in <module> from spyne.server import ServerBase, NullServer File "C:\Users\David374\PycharmProjects\untitled8\venv\lib\site-packages\spyne\server\__init__.py", line 23, in <module> from spyne.server.null import NullServer File "C:\Users\David374\PycharmProjects\untitled8\venv\lib\site-packages\spyne\server\null.py", line 69 self.service = _FunctionProxy(self, self.app, async=False) ^ SyntaxError: invalid syntax
问题原因
这个错误的核心是你安装的Spyne版本与当前Python版本不兼容:
从Python 3.5开始,async成为了保留关键字,不能直接用作函数参数名。但你安装的Spyne版本在内部代码中使用了async=False这样的写法,这在Python 3.5+中会直接触发语法错误(因为async是关键字,不能当作参数名使用)。
解决方案
有两种可行的解决办法:
1. 降级Spyne到兼容的旧版本
安装一个不使用async作为参数名的旧版Spyne,比如2.14.x系列,这是最后一批兼容Python 3.5+且避免关键字冲突的稳定版本。执行以下命令:
pip install spyne==2.14.0
安装完成后,重新运行你的代码,语法错误应该就会消失。
2. 临时修改Spyne内部代码(不推荐)
如果你不想降级,可以手动修改Spyne库的null.py文件:找到报错的那一行,把async改成async_,同时确保_FunctionProxy函数的参数定义也对应改成async_。不过这种方法需要修改库文件,后续更新Spyne时会被覆盖,所以仅作为临时应急方案。
另外,注意到你的导入语句里写了from spyne import Application, rpc, ServiceBase, Iterable, UnsignedInteger, \,但实际代码中只用到了Application, rpc, ServiceBase, Unicode,建议删掉多余的导入项,避免潜在的依赖问题。
内容的提问来源于stack exchange,提问作者David

