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

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

ただいまの
回答率

90.50%

  • Python

    10811questions

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

  • Python 3.x

    8930questions

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

  • C++

    4183questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Python 2.7

    1413questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

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

解決済

回答 3

投稿 編集

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

nonshi

score 7

実現したいこと

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/15 18:32 編集

    python.hがないといわれていて,入れようとしてもやり方がわかりません。
    環境は追記しておきます。力添えよろしくお願いします。
    追記
    すみません、解決しました。最終的な目標にはたどり着いていないのでもう少しお付き合いください

    キャンセル

  • 2019/03/15 19:54 編集

    現在python.hをインクルードしてそのあとpython36.lidがないと言われ、debugからReleaseに変更した際にエラー文はなくなり、buildはできるようになったのですがエラーをはかれてしまい実行できません。どのようにすればよろしいでしょうか?
    参考にしたサイト
    https://www.codeproject.com/Articles/820116/Embedding-Python-program-in-a-C-Cplusplus-code
    現在の状況を画像で添付しました。

    キャンセル

  • 2019/03/15 21:29

    ひとつ前の章にWindowsでのDLLのリンクのしかたが説明してありますね。
    https://docs.python.org/ja/3/extending/windows.html

    キャンセル

  • 2019/03/16 02:52

    こちらはpython上でC++を使ったmoduleの作り方?と思っていましたがこれであってるんですね。やってみます。

    キャンセル

  • 2019/03/17 02:07 編集

    こちらの方法ではないのですが無事現在の問題は解決することができました。
    しかし、私はまた新たな問題に直面して実際にpickleデータを開こうと思ったのですが12行目の紫が現在python3にはない関数?がありうまく起動することができません。そこで自分なりに調べて前の代わりを書いてみたのですがうまくいきません。
    もし解決策があれば教えてもらえますでしょうか?よろしくお願いします。

    キャンセル

  • 2019/03/17 07:25

    「詰まっている」画像は差し替えないで履歴として残したらどうでしょう。前に見たはずのものがないので一瞬自分の正気を疑いました。

    キャンセル

  • 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 03:17

    毎回コメントありがとうございます!今回もよろしくお願いします。
    本題なのですが現在c++だけで完結できるか試しておりまして、それができなかった場合この方法を試してみようと思います!その時はよろしくお願いします。

    キャンセル

  • 2019/03/17 04:34 編集

    ごめんなさい、はっきり言って守備範囲外なので「よろしくお願いします!」は拒否ります。
    他にこのへんが得意な人がいればいいんですが、teratailもそんなにユーザー層分厚くないので「いたらラッキーだね」程度だと思います。あと、仮にいても面倒くさいと思って回答しない可能性も高い。
    こういうコアなことをQAサイト頼りながらやるというのも厳しいものがあるので、何やるにしても原則自力でどうぞ。

    キャンセル

  • 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

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

    キャンセル

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

  • Python

    10811questions

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

  • Python 3.x

    8930questions

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

  • C++

    4183questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Python 2.7

    1413questions

    Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。