C++调用python3

注:为了方便,我把我在这个过程中的一些问题列在列下面,有很多bug的解决还是能在下面找到答案,希望能帮到你们。
鉴于博主我比较菜,所以这篇博客其实是建议如果要用C++调用还是Python2吧。当然可能一段时间以后有比较好的解决办法或者python3变得更科学,或者你们知道很好的思路,欢迎评论区交流。

1. 配置

  1. 项目–>属性–>vc++目录–>包含目录 添加python安装目录中include目录
  2. 项目–>属性–>vc++目录–>库目录
  3. 添加python安装目录中libs目录 链接器–>输入–>附加依赖项 添加python35.lib

2. 在C++中调用python(版本3.5)

手册里是建议这样产生一个类: 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);
}
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章