私は映画推薦者を作っています。私の推薦エンジンはPythonで書かれています。そして私はウェブサイトからnode.js(Express)を介してそれを実行しています。node.jsからPythonスクリプトを実行するときのparseError
pythonコード自体が動作します。コンソールから実行したときの出力がここにあります。それは映画のタイトルと選ばれた映画との類似性を持つ行列を返す計算のためのパンダとnumpyのを使用している、と私はまた、ハロー印刷:
私のウェブサイト上でPython command code
私は、体内のHTML次ています:
<form class="test" method="post" action="/test">
<input type="text" name="user[name]">
<input class="button" type="submit" value="Submit">
</form>
JSクライアント側
(function($) {
$(document).ready(function() {
var btn = $('.button'),
input = $('input');
btn.on('click', function() {
e.preventDefault();
})
})
})(jQuery)
JSサーバ側は、とエクスプレス
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
var PythonShell = require('python-shell');
var options = {
mode: 'text',
pythonOptions: ['-u'],
scriptPath: "E:/Praca Magisterska/Python",
};
app.use(express.static(path.join(__dirname, '')));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.get('/', function (req, res) {
res.sendFile(path.join(__dirname+'/index.html'));
})
app.post('/test', function (req, res) {
console.log(req.body);
PythonShell.run('similarMovies.py', options, function (err, results) {
if (err) throw err;
// results is an array consisting of messages collected during execution
console.log('results: %j', results);
});
})
app.listen(3000, function() {
console.log('Example app listening on port 3000!');
})
だから、それがどのように動作しますか。 submit btnをクリックすると、私はnode.jsを実行してpythonスクリプトを実行してから、console.log
という結果を出します。残念ながら私は最後にエラーが発生しています。私は、関数を実行し、代わりにそれをしないとき
はしかし、私はちょうど私のPythonの最後に書きます:コードの
print "hello"
print 2
結果が良く解析されます。問題になる可能性がどのような
?私がゼロで分けて、もう一つは関数内で分けているエロス?しかし、私はCMDから直接それを実行したときに、それが動作している理由をはいている場合 - python similarMovies.py
ここのpythonコードです:
# -*- coding: utf-8 -*-
import pandas as pd
import numpy as np
def showSimilarMovies(movieTitle, minRatings):
# import ratingów z pliku csv
rating_cols = ['user_id', 'movie_id', 'rating']
rating = pd.read_csv('E:/Praca Magisterska/MovieLens Data/ratings.csv', names = rating_cols, usecols = range(3))
# import filmów z pliku csv
movie_cols = ['movie_id', 'title']
movie = pd.read_csv('E:/Praca Magisterska/MovieLens Data/movies.csv', names = movie_cols, usecols = range(2))
# łączenie zaimportowanych ratingów oraz filmów, usuwanie pierwszego wiersza
ratings = pd.merge(movie, rating)
ratings = ratings.drop(ratings.index[[0]])
# konwertowanie kolumn ze stringów na numeric
ratings['rating'] = pd.to_numeric(ratings['rating'])
ratings['user_id'] = pd.to_numeric(ratings['user_id'])
# tworzenie macierzy pokazująceje oceny filmów przez wszystkich użytkowników.
movieRatingsPivot = ratings.pivot_table(index=['user_id'], columns=['title'], values='rating')
# filtrowanie kolumny do obliczania filmów podobnych
starWarsRating = movieRatingsPivot[movieTitle]
# obliczanie korelacji danego filmu z każdym innym i wyrzucanie tych z którymi nic go nie łączy
similarMovies = movieRatingsPivot.corrwith(starWarsRating)
similarMovies = pd.DataFrame(similarMovies.dropna())
# zmiana nazwy kolumny oraz sortowanie według rosnącej korelacji
similarMovies.columns = ['similarity']
similarMovies.sort_values(by=['similarity'], ascending=False)
# tworzenie statystyk dla filmów, size to ilość ocen, a mean to średnia z ocen
# zgrupowane po tytułach
movieStats = ratings.groupby('title').agg({'rating': [np.size, np.mean]})
# popularne filmy, które mają więcej niż 100 ocen
popularMovies = movieStats['rating']['size']>=minRatings
# sortowanie popularnych filmów od najwyższej średniej
movieStats[popularMovies].sort_values(by=[('rating', 'mean')], ascending=False)
# łączenie popularnych filmów z filmami podobnymi do filtrowanego filmu i ich sortowanie
moviesBySimilarity = movieStats[popularMovies].join(similarMovies)
x = moviesBySimilarity.sort_values(by='similarity', ascending=False)
k = x.drop(x.columns[[0, 1]], axis = 1)
k = k.drop(x.index[[0]])
return k
print "hello"
print 2
showSimilarMovies('Star Wars: Episode VI - Return of the Jedi (1983)', 300)
'showSimilarMovies'の呼び出しを' try ... except BaseException except e:をopen( "error.txt"、 "w")とf:f.write(repr(e)) 'のようにラップすることを検討してください。考え方は例外をどこかに記録することで、正確に何がクラッシュしたのかを知ることができます。 – drdaeman
@drdaeman お待ちしております: 'open(" error.txt "、" w ")とf: try: showSimilarMovies( 'スターウォーズ:エピソードVI - ジェダイの帰還(1983)'、300 ) BaseExceptionを除いてe: f.write(repr(e)) ' 残念ながら、error.txtは空です。私はあなたのバージョンを試してみましたが、error.txtも作成していませんでした。 – Pacxiu
ちょっと、私は関数showSimilarMoviesにすべての行の 'starWarsRating = movieRatingsPivot [movieTitle]'でコメントし、関数から出力としてこの変数を表示しました。 Pythonシェルパーサーは、コマンドと結果のイメージに表示されるnumpyとpandasの警告のために何らかの形でスクリプトを終了していますが、どうすればそれらのエラーを無視し、最後にスクリプトを実行するだけですか? – Pacxiu