C++呼び出しpython 3


注:便利のために、私はこの過程の中のいくつかの問題を列の下に並べて、多くのバグの解決はやはり下で答えを見つけることができて、あなたたちを助けることができることを望んでいます.ブロガーは私が料理を比較しているので、このブログは実はC++で呼び出すかPython 2を使うかをお勧めします.もちろん、しばらくしてから良い解決策があるかもしれません.python 3がもっと科学的になったり、良い考えを知っていたりして、コメントエリアの交流を歓迎します.
1.構成
  • プロジェクト->プロパティ->vc++ディレクトリ->ディレクトリ追加pythonインストールディレクトリを含むincludeディレクトリ
  • プロジェクト->プロパティ->vc++ディレクトリ->ライブラリディレクトリ
  • pythonインストールディレクトリのlibsディレクトリリンクの追加->入力->依存項目の追加python 35.lib

  • 2.C++でpythonを呼び出す(バージョン3.5)
  • は以下を参照するつもりですが、これらはすべてC++呼び出しpython 2 C++呼び出しpython C++に埋め込まれたpythonプログラムです.APIインタフェースを使用して、関数からクラス
  • までです.
  • それからこの文章を見つけましたが、中にはクラスが含まれていません.簡単な関数呼び出しc++とPython 3だけが
  • を呼び出しています.
  • 掲示板で見つけた返事はこんな
  • マニュアルでは、このようなクラスを生成することをお勧めします.https://docs.python.org/3/extending/newtypes.htmlもう1つの方法はPyType_を呼び出すことですTypeというオブジェクトがインスタンスを生成するのもクラスです...
    ソース:質問リンク:http://bbs.csdn.net/topics/390748303
  • 組です.マニュアルがあるのはもちろんマニュアルを見ています.マニュアルでは新大陸の様子が発見できるようです.でも後で気づいたのは、Import classに関するものが見つからなかったExtending Python with C or C+'
  • 次はこれまで無視されていた文章です.タイトルはいつもPythonでC++を呼び出していると思っていたからです.「何か問題があったら、英語の資料をたくさん調べてください.国内のこの方面の知識は少ないです」と心の底にある.Python埋め込みC++詳細(3)-Import Class
  • エラー:
    python 35_が見つかりませんd.libというファイル.
    考え方:pyconfig.hでpragma comment(lib,"python35_d.lib") pragma comment(lib,"python35.lib")を発見したのか、それとも間違っていたのか.解决:おとなしくソースコードでコンパイルして生成しましょう.Python.orgダウンロードソースパッケージアドレス:https://www.python.org/downloads/source/Gzipped source tarballを選択してpcbuildディレクトリの下のslnファイルを開くには、VSでソリューションを開く必要があります.低すぎるバージョンのvsではソリューションが開きません.(slnは手帳で開いてVSバージョンの要求を覚えています)debugバージョンプログラムを実行するとpcbulidのwin 32フォルダにpython 35_が見つかりますd.lib
    エラー:Py_Initialize: unable to load the file system codec
    参照リンク:http://stackoverflow.com/questions/5694706/py-initialize-fails-unable-to-load-the-file-system-codecまじめに読むのがおっくうな子供たちは、CからPythonスクリプトunableto load the file system codec ImportErrorエラー解決方法を呼び出すのを参考にすることができます.
    Import Fail
    import module後、pMouleはNULLコード:
        PyObject* pModule = NULL;
        PyObject* fname = PyUnicode_FromString("GameState");
        pModule = PyImport_Import(fname);//GameState:Python   
    

    または
        PyObject* pModule = NULL;
        pModule = PyImport_ImportModule("GameState");//GameState:Python   
    

    PyErr_でPrint()印刷エラーコード
        PyObject* pModule = NULL;
        //PyObject* fname = PyUnicode_FromString("GameState");
        //pModule = PyImport_Import(fname);//GameState:Python   
        pModule = PyImport_ImportModule("GameState");//GameState:Python   
        if (pModule == nullptr)
        {
            PyErr_Print();
            std::exit(1);
        }

    結果:
      File "...\Debug\GameState.py", line 64
        print 'Fail to write result.txt'
                                       ^
    SyntaxError: Missing parentheses in call to 'print'

    これはpython 3がprint(""")なので、カッコ付けしなければなりません.このバグを修正:ソースコードのprintにカッコを付けた後、エラーメッセージを報告します.
    Traceback (most recent call last):
      File "...\Debug\GameState.py", line 1, in <module>
        from layout import Layout
      File "...\Debug\layout.py", line 15, in <module>
        import numpy as np
    ImportError: No module named 'numpy'

    この問題を解決するためにnumpyをインストールします.ブログの記事numpyインストールを参照してください.
    インストールが完了すると、新しいエラーメッセージが表示されます.
    Traceback (most recent call last):
      File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \core\__init__.py", line 16, in from . import multiarray ImportError: cannot import name 'multiarray' During handling of the above exception, another exception occurred: Traceback (most recent call last): File "D:\ \ \SearchProject\mazemfc\Debug\GameState.py", line 1, in from layout import Layout File "D:\ \ \SearchProject\mazemfc\Debug\layout.py", line 15, in import numpy as np File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \__init__.py", line 142, in from . import add_newdocs File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \add_newdocs.py", line 13, in from numpy.lib import add_newdoc File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \lib\__init__.py", line 8, in from .type_check import * File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \lib\type_check.py", line 11, in import numpy.core.numeric as _nx File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages
    umpy
    \core\__init__.py", line 24, in raise ImportError(msg) ImportError: Importing the multiarray numpy extension module failed. Most likely you are trying to import a failed build of numpy. If you're working with a numpy git repo, try `git clean -xdf` (removes all files not under version control). Otherwise reinstall numpy.

    このバグの後、これ以上遊び続ける意欲がなくなり、python 2に変更しました.7天下は太平で、何事も起こらなかった.いくつかのフォーラムとブログを探しても、他の良い解決策を見ていないので、知っている大神たちに教えてほしいです.
    関数の説明:
    PyObject* PyObject_GetAttrString(PyObject*o,char*attr_name)は、モジュールオブジェクトoのattr_を返します.Pythonの式文に相当するname属性または関数:o.attr_name.例:
    /* to call mymod.transform(mymod.message) */ pfunc = PyObject_GetAttrString(pmod, “transform”);
    PyEval_CallObject(PyObject*pfunc,PyObject*pargs)この関数には2つのパラメータがあり、いずれもPythonオブジェクトポインタを指します.pfuncは呼び出すPython関数で、通常はPyObject_を使用できます.GetAttrString()取得;pargsは関数のパラメータリストで、通常Py_が使用できます.BuildValue()構築.例:
    pstr = PyEval_CallObject(pfunc, pargs); PyArg_Parse(pstr, “s”, &cstr); printf(“%s”, cstr); PyObject_CallObjectとPyEveal_CallObjectの違い:後者は比較的直接的で、NULL、and does explicit type checks for args and kwdsを受け入れることがわかる.PyObject_CallObject(PyObject *o, PyObject *a) { ! PyObject *r; ! PyObject *args = a; ! ! if (args == NULL) { ! args = PyTuple_New(0); ! if (args == NULL) ! return NULL; ! } ! ! r = PyEval_CallObject(o, args); ! ! if (args != a) { ! Py_DECREF(args); ! } ! ! return r; } PyObject_CallObject(PyObject *o, PyObject *a) { ! return PyEval_CallObjectWithKeywords(o, a, NULL); } */