質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1554閲覧

PC上で問題なく動くアプリケーションが、PythonAnywhereにアップロードすると、エラーが出るのはなぜ?

1976kaca

総合スコア15

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/09/26 12:49

編集2018/09/26 13:16

前提・実現したいこと

初心者です。Python機械学習プログラミング[第2版]で勉強中です。
第9章 9.4.1で映画レビュー分類アプリケーションを作成しました。
ローカルサーバーで起動したらうまくいったのですが、

PythonAnywhereにファイルをアップロードしてWebを見ようとすると、
以下のエラーログが出ます。

発生している問題・エラーメッセージ

2018-09-23 12:36:22,227: Error running WSGI application
2018-09-23 12:36:22,232: FileNotFoundError: [Errno 2] No such file or directory: '/home/1976kaca/pkl_objects/stopwords.pkl'
2018-09-23 12:36:22,233: File "/var/www/1976kaca_pythonanywhere_com_wsgi.py", line 16, in <module>
2018-09-23 12:36:22,233: from movieclassifier import app as application # noqa
2018-09-23 12:36:22,233:
2018-09-23 12:36:22,233: File "/home/1976kaca/movieclassifier/app.py", line 8, in <module>
2018-09-23 12:36:22,233: from vectorizer import vect
2018-09-23 12:36:22,233:
2018-09-23 12:36:22,234: File "/home/1976kaca/vectorizer.py", line 10, in <module>
2018-09-23 12:36:22,234: 'stopwords.pkl'), 'rb'))

app.pyのソースコードは以下です。

from flask import Flask, render_template, request
from wtforms import Form, TextAreaField, validators
import pickle
import sqlite3
import os
import numpy as np

from vectorizer import vect

app = Flask(name)

cur_dir = os.path.dirname(file)
clf = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'classifier.pkl'),
'rb'))
db = os.path.join(cur_dir, 'reviews.sqlite')

def classify(document):
label = {0: 'negative', 1: 'positive'}
X = vect.transform([document])
y = clf.predict(X)[0]
proba = clf.predict_proba(X).max()
return label[y], proba

def train(document, y):
X = vect.transform([document])
clf.partial_fit(X, [y])

def sqlite_entry(path, document, y):
conn = sqlite3.connect(path)
c = conn.cursor()
c.execute("INSERT INTO review_db (review, sentiment, date)"
" VALUES (?, ?, DATETIME('now'))", (document, y))
conn.commit()
conn.close()

class ReviewForm(Form):
moviereview = TextAreaField('',
[validators.DataRequired(),
validators.length(min=15)])
@app.route('/')
def index():
form = ReviewForm(request.form)
return render_template('reviewform.html', form=form)

@app.route('/results', methods=['POST'])
def results():
form = ReviewForm(request.form)
if request.method == 'POST' and form.validate():
review = request.form['moviereview']
y, proba = classify(review)
return render_template('results.html',
content=review,
prediction=y,
probability=round(proba*100, 2))
return render_template('reviewform.html', form=form)

@app.route('/thanks', methods=['POST'])
def feedback():
feedback = request.form['feedback_button']
review = request.form['review']
prediction = request.form['prediction']

inv_label = {'negative': 0, 'positive': 1} y = inv_label[prediction] if feedback == 'Incorrect': y = int(not(y)) train(review, y) sqlite_entry(db, review, y) return render_template('thanks.html')

if name == 'main':
app.run()

試したこと

movieclassifierディレクトリをベースとして、動くアプリケーションのはずが、
1976kacaディレクトリからpkl_objectsや、vectorizer.pyを読もうとして失敗していると
読み解いたのですが。

WEb上でも
movieclassifier
|_app.py
|_pkl_objects
| |_classifier.pkl
| |_stopwords.pkl
|_reviews.sqlite
|_static
| |_style.css
|_templates
........
とフォルダーの配置などは同じにしてあるのですが、何が間違っているのでしょうか?
教えていただければ幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ファイルが見つからないというエラーです。
カレントディレクトリが想定と違ってるということなんで、そこらへん調べてみよう

投稿2018/09/26 12:52

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

1976kaca

2018/09/26 13:18

ありがとうございます。 ソースコード cur_dir = os.path.dirname(__file__) clf = pickle.load(open(os.path.join(cur_dir, 'pkl_objects', 'classifier.pkl'), 'rb')) db = os.path.join(cur_dir, 'reviews.sqlite') ここらあたりを変えればいいでしょうか? それともカレントディレクトリを指定するようなコードを書けばいいのでしょうか?
y_waiwai

2018/09/26 13:25

カレントディレクトリを指定してやれば確実でしょうけど、 os.getcwdの結果をプリントしてみるとかで確認してみては
1976kaca

2018/09/26 13:31

ありがとうございます。 カレントディレクトリは/home/1976kacaでした。 ということは、 import os os.chdir(/home/1976kaca/movieclassifier)と先頭の行に追加すればいいということでしょうか!
y_waiwai

2018/09/26 13:36 編集

まあ、そういうことでしょうね。 また、カレントディレクトリによって動作がおかしくならないように全てのファイルをフルパスで指定する、というのも一つの方法ですね #なんかの操作をするとカレントディレクトリが変わってしまった、ということも起こったりするので
1976kaca

2018/09/26 14:03 編集

ありがとうございます。 自分の対策は解決には至らず、、、 やはりコードのどこを変えたらいいのかわからないです~ 調べます。
y_waiwai

2018/09/26 14:01

あれ?/home/1976kaca/movieclassifier 以下にファイルが格納されてるんですか? ターミナルでログインして確認してみましょうよ
1976kaca

2018/09/27 12:57 編集

ありがとうございます。ビギナー設定なので、ターミナルからログインできないことがわかりました。
y_waiwai

2018/09/26 14:27

で、エラーメッセージは変わっていませんか? 最初のエラーでは、 /home/1976kaca/pkl_objects/stopwords.pkl というファイルがない、ということでしたが
1976kaca

2018/09/27 12:03 編集

返信が遅れてすみません。 PythonAnywhereのコンソールで、movieclassifierディレクトリに移動し、格納されているファイル、フォルダを確認したら、すべてありました。 home/1976kaca/pk_objectsという構成ではありませんでした。 home/1976kaca/movieclassifier/pkl_objects/stopwords.pklにしたいのですが、、、 app.pyのどこをどう直せばいいのでしょうか?
guest

0

自己解決

WSGI configuration file:
/var/www/1976kaca_pythonanywhere_com_wsgi.py (太字部分)を書き換えることで、
映画レビュー入力画面 → フィードバック入力画面までは表示できるようになりました。

python

1# This file contains the WSGI configuration required to serve up your 2# web application at http://<your-username>.pythonanywhere.com/ 3# It works by setting the variable 'application' to a WSGI handler of some 4# description. 5# 6# The below has been auto-generated for your Flask project 7 8import sys 9 10# add your project directory to the sys.path 11project_home = u'/home/1976kaca**/movieclassifier**' 12if project_home not in sys.path: 13 sys.path = [project_home] + sys.path 14 15# import flask app but need to call it "application" for WSGI to work 16from **app** import app as application # noqa 17 18```フィードバックから先はInternal Server Errorと表示されてうまくいきません。

投稿2018/09/28 14:57

1976kaca

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問