赞
踩
由于一些漏洞隐患,需要将python版本从3.8升级到3.10以上,一开始是打算之间升级到3.11.4,但是由于途中遇到了一些无法解决的“疑难杂症”,最终将版本升级到了3.10.6,以此记录一些途中遇到的一些问题。
之前使用的tensorflow版本时2.5.3,在这个版本下训练的模型如果在高版本的tensorflow下load可能会遇到一些问题,比如在2.12.0版本以上可能会出现ValueError: duplicate parameter name: 'training'的问题,这似乎是在某个版本更新以后tensorflow对模型增加了一些参数单一性检测,具体情况暂时不明,解决方法是将keras换成tensorflow的自带keras,如下
- #修改前
- import tensorflow.python.keras as keras
- model = keras.models.load_model(model_path, compile = False)
-
- #修改后
- import tensorflow as tf
- model = tf.keras.models.load_model(model_path, compile = False)
在python高版本中getargspec已经被移除了,解决方法就是将getargspec换成signature就可以了
如果是如下报错:
- File "/opt/anaconda3/envs/python311/lib/python3.11/site-packages/flask_sqlalchemy/session.py", line 102, in _app_ctx_id
- return id(app_ctx._get_current_object()) # type: ignore[attr-defined]
- ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- File "/opt/anaconda3/envs/python311/lib/python3.11/site-packages/werkzeug/local.py", line 508, in _get_current_object
- raise RuntimeError(unbound_message) from None
- RuntimeError: Working outside of application context.
解决方法就是在initapp下面加上app_context():
例如:
- #修改前
- # init app
- app = FlaskApp(config, options)
-
- # init database
- import server.abc.database as database
- database.init_database(app.app, config, options)
-
- # bind and run router
- bind_and_run_routers(app, config, options, service_group_name)
-
- #修改后
- # init app
- app = FlaskApp(config, options)
-
- with app.app.app_context():
-
-
-
- # init database
- import server.abc.database as database
- database.init_database(app.app, config, options)
-
- # bind and run router
- bind_and_run_routers(app, config, options, service_group_name)

paddle各种包之间的问题是花费我时间最久也最头疼的一个问题,接下来记录过程中的心路历程和遇到的问题
一开始打算之间安装3.11.4的paddle各类包,但是由于一些wheel无法使用pip自动安装,所以paddle相关包基本都要通过源码安装,例如paddlex-dev、paddleocr==2.7.0.2、paddleslim-dev。paddlepaddle是可以自动安装的,但是python3.11以上只有paddlepaddle==2.5.1这一个版本,所以无法指定安装低版本。
在本地的macos上安装这几个包都没有遇到问题,但是在linux服务器(Ubuntu)上安装paddleocr时遇到了无法安装pymupdf-wheel的问题,这个wheel也无法通过源码安装,官网没有提供python3.11的pymupdf==1.20.2版本库,通过在stackoverflow上的一个回答找到了一个解决办法:
通过去pymupdf的官方库里下载pymupdf==1.20.3的源码(https://mupdf.com/downloads/archive/mupdf-1.20.3-source.tar.gz),下载解压后设置环境变量
export PYMUPDF_SETUP_MUPDF_BUILD=your_path
your_path为源码解压文件路径,设置好之后再执行pip install pymupdf==1.20.2即可安装pymupdf,然后再安装paddleocr==2.7.0.2。。
这个是在conda环境下环境路径有问题
手动export LD_LIBRARY_PATH=/your_env/python3106/lib就可以了,但是这种情况只能在当词会话中满足,如果要设置每次会话都自动配置路径的话可以去~/.bash_profile后面加一行
export LD_LIBRARY_PATH=/your_envs/python3106/lib
然后source ~/.bash_profile即可
在python3.9以上出现了无法创建子进程的问题
python3.9前的代码:
- from gevent import pywsgi
- from multiprocessing import Process
- import logger
-
- def app(environ,start_response):
- status = '200 OK'
- headers = [('Content-Type','text/html')]
- start_response(status,headers)
- return [b"Hello!"]
-
- def worker_fun():
- server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
- server.serve_forever()
-
- def run():
- num_processes = 3;
- server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
- server.start()
- logger.info("主线程启动")
- for i in range(num_processes):
- Process(
- target = worker_fun,
- args = (server,)
- ).start()

python3.9之后的代码:
- from gevent import pywsgi
- from multiprocessing import Process
- import logger
-
- def app(environ,start_response):
- status = '200 OK'
- headers = [('Content-Type','text/html')]
- start_response(status,headers)
- return [b"Hello!"]
-
- def worker_fun():
- server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
- server.serve_forever()
-
- def run():
- num_processes = 3;
- server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
- server.start()
- logger.info("主线程启动")
- processes = []
- for i in range(num_processes):
- process = Process(
- target = worker_fun,
- args = (server,)
- )
- processes.append(process)
- process.start()
-
- for process in processes:
- process.join()

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。