当前位置:   article > 正文

关于开发环境从python3.8升级到python3.10期间遇到的一些问题_raise runtimeerror(unbound_message) from none runt

raise runtimeerror(unbound_message) from none runtimeerror: working outside

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

  1. #修改前
  2. import tensorflow.python.keras as keras
  3. model = keras.models.load_model(model_path, compile = False)
  4. #修改后
  5. import tensorflow as tf
  6. 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.

如果是如下报错:

  1. File "/opt/anaconda3/envs/python311/lib/python3.11/site-packages/flask_sqlalchemy/session.py", line 102, in _app_ctx_id
  2. return id(app_ctx._get_current_object()) # type: ignore[attr-defined]
  3. ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  4. File "/opt/anaconda3/envs/python311/lib/python3.11/site-packages/werkzeug/local.py", line 508, in _get_current_object
  5. raise RuntimeError(unbound_message) from None
  6. RuntimeError: Working outside of application context.

解决方法就是在initapp下面加上app_context():

例如:

  1. #修改前
  2. # init app
  3. app = FlaskApp(config, options)
  4. # init database
  5. import server.abc.database as database
  6. database.init_database(app.app, config, options)
  7. # bind and run router
  8. bind_and_run_routers(app, config, options, service_group_name)
  9. #修改后
  10. # init app
  11. app = FlaskApp(config, options)
  12. with app.app.app_context():
  13. # init database
  14. import server.abc.database as database
  15. database.init_database(app.app, config, options)
  16. # bind and run router
  17. 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前的代码:

  1. from gevent import pywsgi
  2. from multiprocessing import Process
  3. import logger
  4. def app(environ,start_response):
  5. status = '200 OK'
  6. headers = [('Content-Type','text/html')]
  7. start_response(status,headers)
  8. return [b"Hello!"]
  9. def worker_fun():
  10. server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
  11. server.serve_forever()
  12. def run():
  13. num_processes = 3;
  14. server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
  15. server.start()
  16. logger.info("主线程启动")
  17. for i in range(num_processes):
  18. Process(
  19. target = worker_fun,
  20. args = (server,)
  21. ).start()

python3.9之后的代码:

  1. from gevent import pywsgi
  2. from multiprocessing import Process
  3. import logger
  4. def app(environ,start_response):
  5. status = '200 OK'
  6. headers = [('Content-Type','text/html')]
  7. start_response(status,headers)
  8. return [b"Hello!"]
  9. def worker_fun():
  10. server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
  11. server.serve_forever()
  12. def run():
  13. num_processes = 3;
  14. server = pywsgi.WSGIServer(('0.0.0.0',8000),app)
  15. server.start()
  16. logger.info("主线程启动")
  17. processes = []
  18. for i in range(num_processes):
  19. process = Process(
  20. target = worker_fun,
  21. args = (server,)
  22. )
  23. processes.append(process)
  24. process.start()
  25. for process in processes:
  26. process.join()

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/213595
推荐阅读
相关标签
  

闽ICP备14008679号