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

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

ただいまの
回答率

90.35%

  • Python 3.x

    8417questions

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

  • Keras

    380questions

  • Elixir

    16questions

    Elixirは、並列処理や関数型に特化した、Erlang VM (BEAM) 上で動作する汎用プログラミング言語です。分散システム、耐障害性、ソフトリアルタイムシステムなどの機能を持ちます。

Elixirとkerasについてです。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 573

Hayato1201

score 108

kerasでの処理を速くしようと思い、このサイト
https://qiita.com/piacere/items/c1af7b6ce472db83cff6
に従って行っているのですが、Pythonを呼び出す部分でエラーになりました。。。
③ElixirからPythonを呼び出すの部分で
iex -S mix
以上の様に入力すると、
Erlang/OTP 20 [erts-9.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

** (Mix) "mix" with no arguments must be executed in a directory with a mix.exs file

Usage: mix [task]

Examples:

mix             - Invokes the default task (mix run) in a project
mix new PATH    - Creates a new Elixir project at the given path
mix help        - Lists all available tasks
mix help TASK   - Prints documentation for a given task

The --help and --version flags can be given instead of a task for usage and versioning information.

この様なエラーが出ます。これはどういうことでしょうか?

_____________________________

追記です

回答ありがとうございます!!

確かにディレクトリの位置を間違えてはいた様です。pyex.exを作ったディレクトリではなくその上のlibやmix.exsがあるディレクトリで実行するべきだったという事ですね?そこで今回そこのディレクトリで行ったのですが、次の様なエラーが出ました・・・これはどういう事でしょうか?
Erlang/OTP 20 [erts-9.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]

===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
===> When submitting a bug report, please include the output of rebar3 report "your command"
** (Mix) Could not compile dependency :erlport, "/Users/tmsmac/.mix/rebar3 bare compile --paths "/Users/tmsmac/Google ドライブ/Elixir/pyex/_build/dev/lib/*/ebin"" command failed. You can recompile this dependency with "mix deps.compile erlport", update it with "mix deps.update erlport" or clean it with "mix deps.clean erlport"


さらに追記です

早速の返信ありがとうございます!!
確かにGoogleドライブから出たところに作り直したらこのエラーがなくなりました。。。ディレクトリの名前なんかでエラーが出ることがあるんですね、、、これは日本語のディレクトリ内からは実行できないものなんでしょうか?結構不便ですね。
また、さらにそこで実行したところ関数名を入力するところまで行ったのですが、ここで今度は以下の様なエラーが出ました。今度はどうすればいいのでしょうか??

I'm Python...receive 3
received from python: 30
** (UndefinedFunctionError) function :python.stop/0 is undefined or private. Did you mean one of:

  • stop/1

(erlport) :python.stop()

ーーーーーーーーーーーーーーーーーーーーーーーーーーー
追記です

今度はiex> Pyex.predict()で以下のようなエラーが出てしまいました。
** (ErlangError) Erlang error: {:python, :"exceptions.ImportError", 'No module named keras.models', [{"/Users/tmsmac/pyex/lib/py_predict_sin.py", 2, "<module>", "from keras.models import Sequential"}, {"/Users/tmsmac/pyex/_build/dev/lib/erlport/priv/python2/erlport/erlang.py", 226, "_incoming_call", "f = import(module, {}, {}, [objects[0]])"}, {"/Users/tmsmac/pyex/_build/dev/lib/erlport/priv/python2/erlport/erlang.py", 234, "_call_with_error_handler", "function(*args)"}]}
(erlport) /Users/tmsmac/pyex/deps/erlport/src/erlport.erl:234: :erlport.call/3
(pyex) lib/pyex.ex:27: Pyex.predict/0

keras単品では動いています。また、pyex.exのコンパイルも通っています。これも上記で修正していただいたようにファイルにpy_をつけたりstopの部分を変えたりしましたがそれでもダメだったので何か他の原因でしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

"mix" with no arguments must be executed in a directory with a mix.exs file 

これはカレントディレクトリに mix.exs ファイルがないという意味のエラーです。

mix.exs ファイルは mix new コマンドで作られます。①Elixirを使えるようにするのところで mix new コマンドを実行していないか、実行はしたものの、そのElixirプロジェクトのディレクトリへ cd するのを忘れているか、どちらかのように思えます。

このコラム内では、/code/配下に「pyex」というプロジェクトを作成した想定とします

と書かれていますので、その通りやるなら以下のようになります(手順通りに Docker を使用してる場合)

# cd /code
# mix new pyex
# cd /code/pyex

(Elixir側「ErlPort」のインストールに従って mix.exs を編集)
(編集できたら以下のコマンドを実行)
# mix deps.get

(Python側「ErlPort」のインストールに従って以下のコマンドを実行)
# pip install erlport

(あとは、③ElixirからPythonを呼び出すに書かれているコマンドを実行する)

追記1

pyex.exを作ったディレクトリではなくその上のlibやmix.exsがあるディレクトリで実行するべきだったという事ですね?

はい。そうです。

** (Mix) Could not compile dependency :erlport, "/Users/tmsmac/.mix/rebar3 bare compile --paths "/Users/tmsmac/Google ドライブ/Elixir/pyex/_build/dev/lib/*/ebin"" command failed.

このエラーは erlport パッケージを rebar3 というツールでビルドしようとしたが、失敗したという内容です。どういう理由で失敗したか表示されてないので困りますね。

こちらで試したところ、Elixir のプロジェクトを日本語のディレクトリ配下に置くと同じエラーが起こりました。試しに pyex ディレクトリを、別の、パスに日本語が含まれていない場所に移動して、再度、iex -S mix を実行してください。

$ docker run -it --rm -v $HOME/code:/code elixir bash
root@df4a64a9ce1d:/# apt update
root@df4a64a9ce1d:/# apt install python python-pip
root@df4a64a9ce1d:/# pip install erlport

root@df4a64a9ce1d:/# cd /code/pyex
root@df4a64a9ce1d:/code/pyex# mix deps.clean --all
* Cleaning erlport

root@df4a64a9ce1d:/code/pyex# cd /code
root@df4a64a9ce1d:/code# mkdir 'google drive'
root@df4a64a9ce1d:/code# mkdir 'google ドライブ'
root@df4a64a9ce1d:/code# cp -rp pyex google\ drive/
root@df4a64a9ce1d:/code# cp -rp pyex google\ ドライブ/

root@df4a64a9ce1d:/code# cd google\ drive/pyex/
root@df4a64a9ce1d:/code/google drive/pyex# mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
  erlport 0.9.8
* Getting erlport (Hex package)
root@df4a64a9ce1d:/code/google drive/pyex# iex -S mix
Erlang/OTP 20 [erts-9.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

===> Compiling erlport
Compiling 1 file (.ex)
Generated pyex app
Interactive Elixir (1.6.1) - press Ctrl+C to exit (type h() ENTER for help)
iex(1)> ^g
User switch command
 --> q

root@df4a64a9ce1d:/code/google drive/pyex# cd ../../google\ ドライブ/pyex/
root@df4a64a9ce1d:/code/google ドライブ/pyex# mix deps.get
Resolving Hex dependencies...
Dependency resolution completed:
  erlport 0.9.8
* Getting erlport (Hex package)
root@df4a64a9ce1d:/code/google ドライブ/pyex# iex -S mix
Erlang/OTP 20 [erts-9.2.1] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

===> Uncaught error in rebar_core. Run with DEBUG=1 to see stacktrace or consult rebar3.crashdump
===> When submitting a bug report, please include the output of `rebar3 report "your command"`
** (Mix) Could not compile dependency :erlport, "/root/.mix/rebar3 bare compile --paths "/code/google ドライブ/pyex/_build/dev/lib/*/ebin"" command failed. You can recompile this dependency with "mix deps.compile erlport", update it with "mix deps.update erlport" or clean it with "mix deps.clean erlport"
root@df4a64a9ce1d:/code/google ドライブ/pyex# 

あと、いままでのエラーとは関係ないのですが、Qiita の記事の③ElixirからPythonを呼び出すの部分でファイル名などの間違いを見つけたので、記事に対する編集リクエストを提出しました。こちらの編集リクエストで左に赤線が表示されている内容は緑線の内容に変更する必要がありますので注意してください。

修正内容

  • ファイル名 lib/sample.py → lib/py_sample.py
  • Elixir コード中の :python.stop → :python.stop( py_exec )

追記2

:python, :"exceptions.ImportError", 'No module named keras.models', [{"/Users/tmsmac/pyex/lib/py_predict_sin.py"

これは Python 側のエラーですね。内容は python が py_predict_sin.py を実行しようとしたところ、keras.modelsモジュールが見つからなかった。

おそらくお使いのマシンに Python の環境がいくつかインストールされていて、pyex.ex で :python.start( [ python_path: 'lib' ] ) を呼んだ時に使われる Python 環境が、keras単品で動かす時の Python 環境とは違うのだと思います。(keras 用でないので keras を見つけられない)

keras単品で動かす前に実行するコマンドはありますか?(例:activate 環境名) もしあるなら、そのコマンドを実行してから、iex -P mix を実行してください。

もしそれでも直らないようなら以下も試してください。 

$ kerasを動かす前に実行するコマンド(例:`activate 環境名`)を実行
$ which python
ここに Python インタープリタへの path が表示される(例: `/Users/tmsmac/anaconda/envs/myenv/bin/python`)

Python への path がわかったら、pyex.ex の :python.start( [ python_path: 'lib' ] ) に以下のように python: ... オプションを追加する。

  def predict() do
    { :ok, py_exec } = :python.start( [ python: '上で調べたPythonインタープリタへのpath',
                                        python_path: 'lib' ] )

iex で recompile してから Pyex.predict() を再度実行する。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/02/25 13:35

    質問の追記部分(erlport のコンパイルエラー)について、回答に追記しました。

    キャンセル

  • 2018/02/25 14:09

    さらに追記さていただきました。何度もすみません。

    キャンセル

  • 2018/02/25 14:19 編集

    いえいえ、大丈夫ですよ。:python.stop/0 のエラーは私も遭遇しました。元記事の間違いのようです。さっき私が追記した回答の最後のところに、編集リクエストへのリンクがありますので、リンク先を参考に Elixir コードを修正してください。

    キャンセル

  • 2018/02/25 15:01

    ありがとうございます。
    その通りに直したとおもうのですがやはりエラーが出てしまいます。。。一応実行はされて30という値にはなってはいますが、その後に上記に書いたようなエラーが出ます。これは問題ないのでしょうか?
    また、一応実行はできているので、次のコードも試してみようと思ったのですが、iex> recompileがうまくいきません。これは、iex -S mixと入力してからするのでしょうか?そうした場合noopと出てしまいます。また、最初からiex> recompileと打つと何も動きません。Elixirの知識が無いものでこの辺もよく分かりません。。。

    キャンセル

  • 2018/02/25 15:27

    説明不足でした。:python.stop( py_exec ) と修正した後に recompile が必要でしたね。

    Elixir のコードは iex の起動時(iex -S mix を実行した時)にコンパイルされます。iex の立ち上げ後に Elixir のソースファイルの内容を修正した場合は、修正を反映するために recompile を実行するか、iex をいったん終了する必要があります(Ctrl + C を二回押す)

    それから、recompile で :noop が返ってくる時は「変更されたソースファイルがないのでコンパイルを行わなかった」という意味になります。(もしコンパイルするソースファイルがあったときは、:ok が返ってきます)

    あ、もしかして、元の場所(Google ドライブ)にあるソースファイルを修正しているのかな。日本語ディレクトリ名の問題で pyex を別の場所にコピーしたと思いますので、そちらのソースファイルを修正しているか、もう一度、確認してください。

    キャンセル

  • 2018/02/25 17:01

    ありがとうございました!お陰様でエラーも取れたのでいよいよkerasを呼び出すところまで行きました。しかしまたしても実行するところでエラーが起きてしまいました。。。少し長くなるので質問に追記させてください。。。

    キャンセル

  • 2018/02/25 17:01

    > iex> recompileがうまくいきません。これは、iex -S mixと入力してからするのでしょうか?

    はい。そうです。

    1. ターミナルで iex -S mix を入力し iex シェルを起動する → プロンプト「iex(1)>」が表示される(※)。
    2. 別のウィンドウ(エディタアプリなどで)ソースファイルを修正して保存する。
    3. 変更を反映する(再コンパイル)するために、iex シェルのプロンプトに対して recompile と入力しリターンキーを押す → :ok と表示される。

    ※プロンプトはコマンドを入力するたびに iex(1)> → iex(2)> → iex(3)> のように数字が増えていきます。この数字の部分は本質的ではないので、元の記事では一律に「iex> 」と表示しています。「iex> 〇〇」と書かれている時は、iex のプロンプトに対して〇〇というコマンドを入力すると解釈してください。

    キャンセル

  • 2018/02/25 17:04

    あ、行き違いでコメントを投稿してしまいました。kerasを呼び出すところまで行ったんですね。よかったです!

    私はこれから外出してしまうのと、kerasはまだインストールしてないことがあり、次の質問にはすぐに回答できないかもしれません。一応、元記事を書かれた方には、元記事のコメントで質問が上がっている旨、連絡を入れてあります(まだ返事はありませんが)

    キャンセル

  • 2018/02/25 17:06

    承知しました!ここまでわざわざありがとうございました!助かります!

    キャンセル

  • 2018/02/25 21:00

    私自身は keras はまだインストールしてないので試せてはいないのですが、とりあえず私の分かる範囲での対応方法を回答に追記しました(追記2のところ)。(元記事は12月に公開された時に読んで、いつか時間のある時に試そうと思っているうちに試すのを忘れてしまってました...)

    キャンセル

  • 2018/02/25 23:54 編集

    そうだったんっですね!ぜひこの機会に試して見てください笑
    keras単品で動かす前に実行するコマンドというのは特になく、py_predict_sinがあるlibのディレクトリに移動してPython3 py_predict_sinで実行しています。pathを調べて以下のように
    def predict() do
    { :ok, py_exec } = :python.start( [ python: '/usr/bin/python', python_path: 'lib' ] )
    :python.call( py_exec, :py_predict_sin, :predict, [] )
    :python.stop( py_exec )
    end
    としたのですがやはり同じエラーが出ます。。。

    キャンセル

  • 2018/02/25 23:57

    もし解決策がお分かりのようでしたらお時間のある際にまたぜひお願いいたします!

    キャンセル

  • 2018/02/26 07:08 編集

    python3 py_predict_sin で実行してるんですね。Elixir からですと python py_predict_sin が実行されてしまうので、きっとそのせいでうまく動かないのだと思います。

    which python3

    で path を調べて、:python.start( [ python: ..., ... ] ) に設定してみてください。

    キャンセル

  • 2018/02/26 10:07

    ありがとうございます!お陰様でついに実行することができました!
    ただ最後にsin関数のグラフが出て来るところまではいいのですが、それをバツを押して消そうとすると、以下のようなエラーが出てきてフリーズするのでCtrl+Cで終了しなければならなくなります。このエラーは何なのでしょうか??
    ** (ErlangError) Erlang error: {:python, :"builtins.AttributeError", 'module \'py_predict_sin\' has no attribute \'predict\'', {:"$erlport.opaque", :python, <<128, 2, 99, 116, 114, 97, 99, 101, 98, 97, 99, 107, 10, 83, 116, 97, 99, 107, 83, 117, 109, 109, 97, 114, 121, 10, 113, 0, 41, 129, 113, 1, 40, 99, 116, 114, 97, 99, 101, 98, 97, 99, 107, ...>>}}
    (erlport) /Users/tmsmac/pyex/deps/erlport/src/erlport.erl:234: :erlport.call/3
    (pyex) lib/pyex.ex:27: Pyex.predict/0

    キャンセル

  • 2018/02/26 20:38

    実行できてよかったです。あとひと息ですね!

    module 'py_predict_sin' has no attribute 'predict'' ですが、Elixir から py_predict_sin.py の predict() 関数を呼び出そうとしたが、そんな関数はなかった、というエラーです。元記事のプログラムの問題のようだったので、修正して、編集リクエストを送りました。修正後の py_predict_sin.py はこちらのページで見られます。

    https://qiita.com/piacere/items/c1af7b6ce472db83cff6/patches/44389?type=preview

    念のため macOS High Sierra に Keras と Elixir をインストールして、上のページの内容で ⑤ElixirからKerasを呼び出すまで実行できることを確認済みです。

    キャンセル

  • 2018/02/27 11:57

    ここまで本当にありがとうございました。ついに全てのエラーが消えました。
    今回非常に助かりました。フォローもさせていただきしたが、今後とももし何かあればよろしくお願いいたします!

    キャンセル

  • 2018/02/27 12:57

    すみません、早速また問題が出てしまいました・・・もしよろしければリクエストさせていただいたのでお時間があればよろしくお願いします・・

    キャンセル

  • 2018/02/27 14:03

    あ、大丈夫なようでした、ご迷惑おかけしました!

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python 3.x

    8417questions

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

  • Keras

    380questions

  • Elixir

    16questions

    Elixirは、並列処理や関数型に特化した、Erlang VM (BEAM) 上で動作する汎用プログラミング言語です。分散システム、耐障害性、ソフトリアルタイムシステムなどの機能を持ちます。