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

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

ただいまの
回答率

89.99%

pythonで学習したデータをpickleファイルをC++で開きたい

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,014

nonshi

score 11

実現したいこと

scikit-learnで学習した結果をpickle moduleで保存し、そのファイルをC++で開きたいと考えています。
しかし、調べてもなかなか出てこなくそもそもできないんじゃないかと考えています。
どなたか知っている方がいましたらそれについての大まかな方法の回答をお願いします。
よろしくお願いします。

c++で実行したい or C++からpythonに実行命令を出したいpythonコード

import pickle
#保存しているpklファイルを読み込む
with open("model.pkl", "rb") as f:
    model = pickle.load(f)
#ここで予測したい値を入れる
X_test = [[0.0401541,0.155155]]
#予測結果を出す
print(model.predict(X_test))

現在考えられるアプローチ(2パターン)

c++でpython実行
1、c++でpickle moduleを使えるようにする

C++からpythonに実行命令
1、C++から値をを送る
2、受け取った値ををpythonで処理
3、出した値をc++に返す

可能性がある順番
1.C++にpython組み込み(C++でpickle使ってそのまま組み込み)
2.C++からpython1関数をよびだし
3.Boost.pythonを使う
4.pybind11を使う

環境

windows10
Visual Studio 2017

解決策(解決しましたが・・・)

C++からPython関数を呼び出して変数を渡して処理した値を返してもらう方法
でできたのですが速度が出なくて現在下のアプローチで試しています。

現在詰まっている状況(未解決)

C++にPythonを組み込む
イメージ説明
ちなみに現在PyFile_FromStringの書き方はpython3では無くなっていたらしく、2系にも落としたのですが最終的にはstr型じゃないからダメ!と言われこの方法はあきらめかけています。
参考にしているサイト
https://stackoverflow.com/questions/35768773/loading-python-pickled-object-in-c

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

大まかに。

この章や関連の文書を見てみてください。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/17 09:43

    了解です。アドバイスのほうさっそく取り入れてみます。

    キャンセル

  • 2019/03/19 18:30

    横から失礼します。
    エラー箇所ですが、PyRun_SimpleStringではなくPyFile_FromStringではないでしょうか。
    外してたらすいません。

    キャンセル

  • 2019/03/19 20:08

    @red_bb様
    そうです、現在掲載してるのは自分が試行錯誤している部分です。
    現在PyFile_FromStringの書き方はpython3では無くなっていたらしく、自分なりに試行錯誤していました。
    今見返すと誤解を招くような写真なので取り替えておきます。ご指摘ありがとうございます。

    キャンセル

+2

質問文の画像、pは大文字かと。

さすがに直にC++とPythonのインターフェースを書くのは苦行じみてるので、cython介してDLLにしてそれ経由で呼ぶというのは?

https://qiita.com/SatoshiTerasaki/items/0df5970eebf9e0ab4031
https://qiita.com/SatoshiTerasaki/items/6238fc075e8a47f44552
http://yoshidabenjiro.hatenablog.com/entry/2018/05/12/004801
http://yukisakamoto.hatenablog.com/entry/2015/09/22/105630

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/17 06:39

    なるほど・・・、そうなんですね。頑張ってやってみます!

    キャンセル

  • 2019/03/18 01:11

    あとcythonの他にboost.pythonというのもありましたね。これに頼るというのもありかも

    キャンセル

  • 2019/03/19 20:10

    現在、試してるのですがなかなかうまくいかないです(ネットを漁っては実装してました)。これからはこの公式サイトを見てどんなコードがあるか片っ端から見てみます。

    キャンセル

check解決した方法

+1

すみません、お騒がせしましたが最終的に実行できるようになりました。
方法としてはC++からPythonの特定の関数を呼び出してこちらに値を返してもらう方法でできました。
けど、今は最初のアプローチのC++にPythonコードを埋め込む方法ができていないので、試行錯誤してます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/03/22 06:11

    最終的に私の力ではpython関数を外部に置き、C++から持ってくる方法しかできませんでした。その時の時間は500msととても遅いです。どなたか参考になれば幸いです。
    また、助言、回答してくださった方たちには感謝します。

    キャンセル

  • 2019/03/22 06:14

    どんな実装なのかわからないとコメントしづらいのでコード載せてほしいんですが、そもそも延々とここでやるより、一旦こちらは解決済みにして別質問を立てた方が良いのでは?

    キャンセル

  • 2019/03/22 09:00

    解決済みにするのを忘れていました。
    そうですね、一回違うスレを立てようと思います。

    キャンセル

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

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