由于一些漏洞隐患,需要将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()