注:为了方便,我把我在这个过程中的一些问题列在列下面,有很多bug的解决还是能在下面找到答案,希望能帮到你们。
鉴于博主我比较菜,所以这篇博客其实是建议如果要用C++调用还是Python2吧。当然可能一段时间以后有比较好的解决办法或者python3变得更科学,或者你们知道很好的思路,欢迎评论区交流。
1. 配置
- 项目–>属性–>vc++目录–>包含目录 添加python安装目录中include目录
- 项目–>属性–>vc++目录–>库目录
- 添加python安装目录中libs目录 链接器–>输入–>附加依赖项 添加python35.lib
2. 在C++中调用python(版本3.5)
准备参考以下做,但是这些都是C++调用python2
C++ 调用 python
C++中嵌入python程序——使用API接口,从函数到类然后找到了这篇文章,但是里面不涉及类,只有简单的函数调用
c++与Python3互相调用在贴吧里找到的回复是这样的
手册里是建议这样产生一个类: https://docs.python.org/3/extending/newtypes.html
另外一种方式是调用PyType_Type这个对象来产生一个实例,也是个类来的…
来源:问题链接:http://bbs.csdn.net/topics/390748303
对的,有手册当然是看手册。在手册里好像可以发现新大陆的样子。但是后来我发现,还是找不到关于Import class的东西
Extending Python with C or C++‘下面这个是之前被忽略的一篇文章,因为标题总让我以为是在Python里调用C++。文里的一句话到了心坎上“有什么问题记得多查英文资料,国内的这方面知识少”。
Python嵌入C++详解(3)–Import Class
报错:
找不到python35_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的win32文件夹里能找到python35_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'
这个是由于python3的是print(“”),必须加括号。
修复这个bug:把源代码中的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\numpy\core\__init__.py", line 16, in <module>
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 <module>
from layout import Layout
File "D:\大三下\人工智能导论\SearchProject\mazemfc\Debug\layout.py", line 15, in <module>
import numpy as np
File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages\numpy\__init__.py", line 142, in <module>
from . import add_newdocs
File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages\numpy\add_newdocs.py", line 13, in <module>
from numpy.lib import add_newdoc
File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages\numpy\lib\__init__.py", line 8, in <module>
from .type_check import *
File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages\numpy\lib\type_check.py", line 11, in <module>
import numpy.core.numeric as _nx
File "C:\Users\siyu\AppData\Local\Programs\Python\Python35\lib\site-packages\numpy\core\__init__.py", line 24, in <module>
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.
在这个bug之后就没有再继续玩下去的欲望了,换了python2.7天下太平,什么事情都没有发生。找了一些论坛和博客也没看到此外的好的解决办法,希望懂的大神们可以告知。
函数说明:
PyObject* PyObject_GetAttrString( PyObject *o, char *attr_name)
返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句:o.attr_name。例:
/* to call mymod.transform(mymod.message) */
pfunc = PyObject_GetAttrString(pmod, “transform”);
PyEval_CallObject(PyObject* pfunc, PyObject* pargs)
此函数有两个参数,都指向Python对象指针,pfunc是要调用的Python 函数,通常可用PyObject_GetAttrString()获得;pargs是函数的参数列表,通常可用Py_BuildValue()构建。例:
pstr = PyEval_CallObject(pfunc, pargs);
PyArg_Parse(pstr, “s”, &cstr);
printf(“%s\n”, cstr);
PyObject_CallObject和 PyEval_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);
}
*/