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

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

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

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2552閲覧

pythonshellの使い方について

kaki.k

総合スコア19

Python 3.x

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

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

2クリップ

投稿2019/07/02 16:35

javascript上でpython-shellを使ってpythonを呼びだそうとしています。

コードは公式(?)のサイトから参考にしています。
python-shell - npm

javascript

1let { PythonShell } = require('python-shell'); 2 3let options = { 4 mode: 'text', 5 pythonPath: '/usr/lib/python3.5', 6 pythonOptions: ['-u'], // get print results in real-time 7 scriptPath: '/home/M1/web/test.py', 8 args: [envelope.latitude, envelope.longitude, envelope.spot] 9}; 10 11PythonShell.run('test.py', options, function (err, results) { 12 if (err) throw err; 13 // results is an array consisting of messages collected during execution 14 console.log('results: %j', results); 15});

実行したところ以下のようなエラーが出ました。

/home/M1/web/node_modules/python-shell/index.js:99 self.parser && self[name].setEncoding(options.encoding || 'utf8'); ^ TypeError: Cannot read property 'setEncoding' of undefined at /home/M1/web/node_modules/python-shell/index.js:99:39 at Array.forEach (<anonymous>) at new PythonShell (/home/M1/web/node_modules/python-shell/index.js:97:39) at Function.run (/home/M1/web/node_modules/python-shell/index.js:197:23) at WebSocket.client.on (/home//M1/web/get_latlon.js:49:21) at WebSocket.emit (events.js:198:13) at Receiver.receiverOnMessage (/home/M1/web/node_modules/ws/lib/websocket.js:720:20) at Receiver.emit (events.js:198:13) at Receiver.dataMessage (/home/M1/web/node_modules/ws/lib/receiver.js:414:14) at Receiver.getData (/home/M1/web/node_modules/ws/lib/receiver.js:346:17)

そもそも let option の設定がいまいちわかっておらず
いろんなサイトを見たり、友達に聞きながら設定したのですが、
scriptPath とは呼び出すpythonのファイルの場所を指定すればよかったのでしょうか?
また、argsの書き方もあってるか不安です。。。

エラーの意味や解決策など教えていただければ嬉しいです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。面白そうだったので見てみました。
できれば、test.py のソースコードも載せていただけるといいのですが、コメントしてみます。


optionsは何?

optionsは、実際にはコマンドラインでpythonを実行するのときに渡す引数に該当しますね。

ですから、実際には JavaScript (Node.js) 経由でなく、以下をコマンドラインで実行するのと同じになります。

bash

1% /usr/lib/python3.5/python -u /home/M1/web/test.py

ところで、このoptionの scriptPath: '/home/M1/web/test.py’ と設定されていますが、もし実行したいファイルが test.py なら、ここは scriptPath: '/home/M1/web/’, に直したほうがいいかな?と思います。

実際に実行するのは PythonShell.run(‘test.py’ のところで、scriptPath(ディレクトリ)の中にある test.py を実行するという意味です。

test.pyのコード側を確認

もし修正済みで、それでもエラーでしたら、こんどは test.py 側のほうが問題ないか確認してみてください。

  • 文字コードがSJISかどうかとか、日本語が混じってないか
  • 直接 python test.py として実行した際はエラーがないか

もし、日本語を含むソースコードになっていたら、# -*- coding: utf-8 -*- をソースの最初につけてみてはいかがでしょう。

コメントをいただいての追記

コメントに貼っていただいた pythonPath: のところは最初の投稿と違いますね。
ここは、ターミナルで "which python" と入力したときに表示されるものを貼ってくださいね。

わたしの環境だと、こうなりますので、

bash

1% which python 2/usr/local/bin/python

こちらを使って、JavaScript側はこんな感じになります。

JavaScript

1let { PythonShell } = require('python-shell'); 2 3const envelope = {"latitude":"15","longitude":"45","spot":"ああ"}; 4 5let options = { 6mode: 'text', 7pythonPath: '/usr/local/bin/python', // which python で表示された結果を指定してください! 8pythonOptions: ['-u'], // get print results in real-time 9scriptPath: '/home/kakimoto/M1/web/', 10args: [envelope.latitude, envelope.longitude, envelope.spot] 11}; 12 13PythonShell.run('test.py', options, function (err, results) { 14if (err) throw err; 15// results is an array consisting of messages collected during execution 16console.log('results: %j', results); 17});

うまくいくと、こうなると思います....。

bash

1node test.js 2results: ["60.0","ああ"]

投稿2019/07/02 23:45

編集2019/07/03 07:52
suama

総合スコア1997

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

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

kaki.k

2019/07/03 05:50 編集

丁寧にありがとうございます。 test.pyのコードもいかに載せておきます。 """ # -*- coding: utf-8 -*- import sys, json args = sys.argv x = float(args[1]) y = float(args[2]) spot = str(args[3]) sol = x + y #出力 print(sol) print(spot) """ 一応、jsの方のコードも載せておきます。 """ let { PythonShell } = require('python-shell'); const envelope = {"latitude":"15","longitude":"45","spot":"ああ"}; let options = { mode: 'text', pythonPath: '/usr/lib/', pythonOptions: ['-u'], // get print results in real-time scriptPath: '/home/kakimoto/M1/web/', args: [envelope.latitude, envelope.longitude, envelope.spot] }; PythonShell.run('test.py', options, function (err, results) { if (err) throw err; // results is an array consisting of messages collected during execution console.log('results: %j', results); }); """ テスト用なので簡単にしています。 いろいろ修正してみましたが、同じエラーが出てしまいました。 プログラマー初心者で見当違いなミスをしているかもしれませんが、 どこかおかしな所はあるでしょうか? (すみません、Markdownの書き方わからなくて変になっています。。。)
suama

2019/07/03 07:50 編集

ありがとうございます。 コメントに貼っていただいた pythonPath: のところは最初の投稿と違いますね。 ここは、ターミナルで "which python" と入力したときに表示されるものを貼ってくださいね。 わたしの環境だと、こうなりますので、 ``` % which python /usr/local/bin/python ``` こちらを使って、JavaScript側はこんな感じになります。 ``` let { PythonShell } = require('python-shell'); const envelope = {"latitude":"15","longitude":"45","spot":"ああ"}; let options = { mode: 'text', pythonPath: '/usr/local/bin/python', // which python で表示された結果を指定してください! pythonOptions: ['-u'], // get print results in real-time scriptPath: '/home/kakimoto/M1/web/', args: [envelope.latitude, envelope.longitude, envelope.spot] }; PythonShell.run('test.py', options, function (err, results) { if (err) throw err; // results is an array consisting of messages collected during execution console.log('results: %j', results); }); ``` うまくいくと、こうなると思います....。 ``` node test.js results: ["60.0","ああ"] ``` コメント欄ではMarkdownがうまく効かないので、回答に追記しておきますね。
kaki.k

2019/07/03 08:16

ありがとうございます! pythonPathのほうがおかしかったようですね。 うまく実装できることができました。 くわえて、たくさんの知識を得ることができました! ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問