关于开发环境从python3.8升级到python3.10期间遇到的一些问题

由于一些漏洞隐患,需要将python版本从3.8升级到3.10以上,一开始是打算之间升级到3.11.4,但是由于途中遇到了一些无法解决的“疑难杂症”,最终将版本升级到了3.10.6,以此记录一些途中遇到的一些问题。

Tensforflow高版本问题

之前使用的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)

ImportError: cannot import name 'getargspec' from 'inspect'

在python高版本中getargspec已经被移除了,解决方法就是将getargspec换成signature就可以了

RuntimeError: Working outside of application context.

如果是如下报错:

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相关问题

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环境报错ImportError: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

这个是在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以上出现了无法创建子进程的问题

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()

你可能感兴趣的:(python,conda)