未改代码却遇TypeError:int与NoneType无法比较的问题求助
Google Cloud Function中pdfminer.six抛出TypeError问题解决
基于pdfminer.six实现PDF内容提取的Google Cloud Function(GCF)此前运行正常,停用两周后再次使用时抛出以下错误:TypeError: '<=' not supported between instances of 'int' and 'NoneType'
该错误同时出现在线上GCF和本地Functions Framework环境中,回滚至历史代码仍报错,但本地脱离Functions Framework运行则完全正常,推测是GCF运行环境的依赖版本变化导致。
完整错误栈
Traceback (most recent call last): File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 2548, in __call__ return self.wsgi_app(environ, start_response) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 2528, in wsgi_app response = self.handle_exception(e) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 2525, in wsgi_app response = self.full_dispatch_request() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1822, in full_dispatch_request rv = self.handle_user_exception(e) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1820, in full_dispatch_request rv = self.dispatch_request() File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/flask/app.py", line 1796, in dispatch_request return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/functions_framework/__init__.py", line 98, in view_func return function(request._get_current_object()) File "/Users/philwakefield/Documents/OpenSet/openset_proj/src/pdf extract/main.py", line 100, in PdfExtract interpreter.process_page(page) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pdfminer/pdfinterp.py", line 842, in process_page self.device.end_page(page) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pdfminer/converter.py", line 48, in end_page self.cur_item.analyze(self.laparams) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pdfminer/layout.py", line 679, in analyze if -1 <= laparams.boxes_flow and laparams.boxes_flow <= +1 and textboxes: TypeError: '<=' not supported between instances of 'int' and 'NoneType'
报错相关代码片段
#extract the data with urllib.request.urlopen(pdf_path) as url: fp = open('openset_schedule_1.pdf', 'rb') #fp = io.BytesIO(url.read()) rsrcmgr = PDFResourceManager() laparams = LAParams(boxes_flow=None, line_margin=0.2, char_margin=0.5) device = PDFPageAggregator(rsrcmgr, laparams=laparams) interpreter = PDFPageInterpreter(rsrcmgr, device) pages = PDFPage.get_pages(fp) for page in pages: interpreter.process_page(page)
问题原因与解决方案
原因分析
错误根源在于pdfminer.six的layout.py代码中,直接对laparams.boxes_flow进行数值范围判断(-1 <= laparams.boxes_flow <= +1),但你传入的参数值为None,导致类型不兼容报错。之前运行正常的原因大概率是:
- 本地环境使用的pdfminer.six旧版本对
boxes_flow=None有兼容处理 - GCF环境自动升级了pdfminer.six版本,移除了该兼容逻辑,而你的代码未锁定依赖版本
解决方案
- 修正参数值:将
boxes_flow=None改为符合要求的数值(范围-1到1之间,例如boxes_flow=0),避免传入None:laparams = LAParams(boxes_flow=0, line_margin=0.2, char_margin=0.5) - 锁定依赖版本:在
requirements.txt中明确指定本地运行正常的pdfminer.six版本号,确保GCF环境使用相同版本,例如:pdfminer.six==20221105 - 验证环境一致性:对比本地与GCF环境的依赖版本,确保所有依赖包版本一致,避免因自动升级导致的兼容性问题。
内容的提问来源于stack exchange,提问作者Phil Wakefield
相关产品推荐
相关产品推荐

