鍍金池/ 問答/Python  Linux/ linux python flask restful調(diào)用post方法報(bào)錯(cuò)no s

linux python flask restful調(diào)用post方法報(bào)錯(cuò)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

#########測(cè)試==========

#####放在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')

運(yùn)行以上代碼報(bào)錯(cuò)(/usr/bin/python3: can't open file 'RFIFL.py': [Errno 2] No such file or directory)
具體錯(cuò)誤如下

/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

但是當(dāng)我把代碼換成這樣的

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

#########測(cè)試==========

#####放在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方法外程序是不能正常運(yùn)行的,當(dāng)放在post方法下的函數(shù)里,程序就可以正常運(yùn)行,請(qǐng)問這是為什么?
我想把這段代碼放在post方法外,不想每次調(diào)post方法都加載一遍這些文件,想放在緩存里供post方法直接調(diào)用,該怎么操作?求大佬告知。好人一生平安

回答
編輯回答
傻丟丟

我建議把

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')刪掉
使用絕對(duì)路徑導(dǎo)入包:

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")寫成一個(gè)函數(shù)也是個(gè)不錯(cuò)的選擇:

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

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

之所以會(huì)出現(xiàn)can't open file 'RFIFL.py': [Errno 2] No such file or directory, 是因?yàn)橐婚_始用os.chdir()改變了基礎(chǔ)路徑, 而app = Flask(__name__), 在修改的路徑中我們找不到/home/nlp/model/IF/RFIFL.py入口文件.

2018年3月6日 00:19