C++呼び出しpython 3
11241 ワード
注:便利のために、私はこの過程の中のいくつかの問題を列の下に並べて、多くのバグの解決はやはり下で答えを見つけることができて、あなたたちを助けることができることを望んでいます.ブロガーは私が料理を比較しているので、このブログは実は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で
エラー: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コード:
または
PyErr_でPrint()印刷エラーコード
結果:
これはpython 3がprint(""")なので、カッコ付けしなければなりません.このバグを修正:ソースコードのprintにカッコを付けた後、エラーメッセージを報告します.
この問題を解決するためにnumpyをインストールします.ブログの記事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); } */
1.構成
2.C++でpythonを呼び出す(バージョン3.5)
ソース:質問リンク:http://bbs.csdn.net/topics/390748303
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); } */