linux python flask restful调用post方法报错no such file

from __future__ import unicode_literals
from flask import Flask
from flask_restful import reqparse,Api, Resource
from flask import Flask,jsonify,request
from flask import abort  

from flask import make_response,Response  
import json

#########测试==========

#####放在11.41库
import jieba
import os
import jieba.analyse
        
app = Flask(__name__)
app.debug = True
app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))
api = Api(app)

os.chdir('/home/nlp/model/IF')
from sklearn.externals import joblib
clf = joblib.load("model.m")
vec = joblib.load("vec.m")
transformer = joblib.load("tfidf.m")
ch2 = joblib.load("ch2.m")

@app.route('/')
def hello_world():  
    return 'hello world'

@app.route('/add_task/', methods=['POST'])
def add_task():
       
    url = request.json['siteDomain']
    if ('guba' in url) or ('直播答题' in 'text'):
        lable = 0  
    else:
        text = request.json['content']
        title = request.json['title']
        content = title + text       
        word_cut = jieba.lcut(content.strip(), cut_all = False)       
        news1 = []
        news1.append(' '.join(word_cut))                            
        x_test11 = vec.transform(news1)               
        x_test21 = transformer.transform(x_test11)
        X_test1 = ch2.transform(x_test21)          
        y1 = clf.predict(X_test1)
        if y1[0] == 0:
            lable = 0 
        else:
            lable = 1       
    rt = {'number':lable}
    return json.dumps(rt)

if __name__ == '__main__':
    app.run(host = '0.0.0.0')

运行以上代码报错(/usr/bin/python3: can't open file 'RFIFL.py': [Errno 2] No such file or directory)
具体错误如下

/usr/local/python/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator SVC from version 0.18.1 when using version 0.19.1. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
/usr/local/python/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator GridSearchCV from version 0.18.1 when using version 0.19.1. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
/usr/local/python/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator CountVectorizer from version 0.18.1 when using version 0.19.1. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
/usr/local/python/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator TfidfTransformer from version 0.18.1 when using version 0.19.1. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
/usr/local/python/lib/python3.6/site-packages/sklearn/base.py:311: UserWarning: Trying to unpickle estimator SelectKBest from version 0.18.1 when using version 0.19.1. This might lead to breaking code or invalid results. Use at your own risk.
  UserWarning)
 * Serving Flask app "RFIFL" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: on
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
 * Restarting with stat
/usr/bin/python3: can't open file 'RFIFL.py': [Errno 2] No such file or directory

但是当我把代码换成这样的

from __future__ import unicode_literals
from flask import Flask
from flask_restful import reqparse,Api, Resource
from flask import Flask,jsonify,request
from flask import abort  

from flask import make_response,Response  
import json

#########测试==========

#####放在11.41库
import jieba
import os
import jieba.analyse
        
app = Flask(__name__)
app.debug = True
app.config.update(RESTFUL_JSON=dict(ensure_ascii=False))
api = Api(app)

@app.route('/')
def hello_world():  
    return 'hello world'

@app.route('/add_task/', methods=['POST'])
def add_task():
    os.chdir('/home/nlp/model/IF')
    from sklearn.externals import joblib
    clf = joblib.load("model.m")
    vec = joblib.load("vec.m")
    transformer = joblib.load("tfidf.m")
    ch2 = joblib.load("ch2.m")   
    url = request.json['siteDomain']
    if ('guba' in url) or ('直播答题' in 'text'):
        lable = 0  
    else:
        text = request.json['content']
        title = request.json['title']
        content = title + text       
        word_cut = jieba.lcut(content.strip(), cut_all = False)       
        news1 = []
        news1.append(' '.join(word_cut))                            
        x_test11 = vec.transform(news1)               
        x_test21 = transformer.transform(x_test11)
        X_test1 = ch2.transform(x_test21)          
        y1 = clf.predict(X_test1)
        if y1[0] == 0:
            lable = 0 
        else:
            lable = 1       
    rt = {'number':lable}
    return json.dumps(rt)

if __name__ == '__main__':
    app.run(host = '0.0.0.0')

os.chdir('/home/nlp/model/IF')
from sklearn.externals import joblib
clf = joblib.load("model.m")
vec = joblib.load("vec.m")
transformer = joblib.load("tfidf.m")
ch2 = joblib.load("ch2.m") 

这段代码一开始放在post方法外程序是不能正常运行的,当放在post方法下的函数里,程序就可以正常运行,请问这是为什么?
我想把这段代码放在post方法外,不想每次调post方法都加载一遍这些文件,想放在缓存里供post方法直接调用,该怎么操作?求大佬告知。好人一生平安

阅读 4.2k
1 个回答

我建议把

os.chdir('/home/nlp/model/IF')
from sklearn.externals import joblib
clf = joblib.load("model.m")
vec = joblib.load("vec.m")
transformer = joblib.load("tfidf.m")
ch2 = joblib.load("ch2.m")

中的os.chdir('/home/nlp/model/IF')删掉
使用绝对路径导入包:

from sklearn.externals import joblib
basedir = '/home/nlp/model/IF'
clf = joblib.load(os.path.join(basedir,"model.m"))
vec = joblib.load(os.path.join(basedir, "vec.m"))
transformer = joblib.load(os.path.join(basedir, "tfidf.m"))
ch2 = joblib.load(os.path.join(basedir, "ch2.m"))

os.path.join(basedir, "filename.m")写成一个函数也是个不错的选择:

def abspath(filename):
    basedir = '/home/nlp/model/IF'
    return os.path.join(basedir, filename)

vec = joblib.load(abspath("vec.m"))

之所以会出现can't open file 'RFIFL.py': [Errno 2] No such file or directory, 是因为一开始用os.chdir()改变了基础路径, 而app = Flask(__name__), 在修改的路径中我们找不到/home/nlp/model/IF/RFIFL.py入口文件.

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题