2017-05-06 13 views
0

私は映画推薦者を作っています。私の推薦エンジンは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 

結果が良く解析されます。問題になる可能性がどのような

Image of command an results

?私がゼロで分けて、もう一つは関数内で分けているエロス?しかし、私は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) 
+0

'showSimilarMovies'の呼び出しを' try ... except BaseException except e:をopen( "error.txt"、 "w")とf:f.write(repr(e)) 'のようにラップすることを検討してください。考え方は例外をどこかに記録することで、正確に何がクラッシュしたのかを知ることができます。 – drdaeman

+0

@drdaeman お待ちしております: 'open(" error.txt "、" w ")とf: try: showSimilarMovies( 'スターウォーズ:エピソードVI - ジェダイの帰還(1983)'、300 ) BaseExceptionを除いてe: f.write(repr(e)) ' 残念ながら、error.txtは空です。私はあなたのバージョンを試してみましたが、error.txtも作成していませんでした。 – Pacxiu

+0

ちょっと、私は関数showSimilarMoviesにすべての行の 'starWarsRating = movieRatingsPivot [movieTitle]'でコメントし、関数から出力としてこの変数を表示しました。 Pythonシェルパーサーは、コマンドと結果のイメージに表示されるnumpyとpandasの警告のために何らかの形でスクリプトを終了していますが、どうすればそれらのエラーを無視し、最後にスクリプトを実行するだけですか? – Pacxiu

答えて

1

は、私はちょうどのpythonファイルのbegginingで2行を追加、それを考え出しました警告を無視する:

import warnings 

warnings.filterwarnings('ignore') 

私の出力は希望されたものです。

関連する問題