運行環境:VS2015 + python3.4
總體步驟簡單來說如下:
- 設置編譯環境,其實就是設置Python的頭文件和庫文件目錄以及一個很讓人頭疼的python3.4_d.lib問題
- 初始化Python解釋器: Py_Initialize();
- 調用Python
- 釋放資源 Py_Finalize();
設置編譯環境
首先新建一個控制檯程序
點開程序屬性設置如下幾個地方,對應的分別是
python頭文件目錄:
python庫文件目錄:
python34_d.lib:
這一步python26_d.lib的生成參考的是文末參考鏈接2,但是我在嘗試的過程中一直出錯,還未找到原因,下次補充。因此我採取了下下策暫時應對。首先我們看下如果沒有這個文件的報錯結果:
要知道這裏爲什麼會有python34.lib和python34_d.lib的差別就是因爲
python_d.lib是 庫的調試後形式,當我們以debug模式編譯工程時,python就用這個lib文件,但是這個文件是不可用 的。對於這點,最快的辦法就是強制要求python在任何情況下都是用非調試版本,就可以了。
根據參考鏈接3中對python頭文件pyconfig.h進行了修改:
# if defined(_DEBUG)
# pragma comment(lib,"python34_d.lib")
# elif defined(Py_LIMITED_API)
# pragma comment(lib,"python3.lib")
# else
# pragma comment(lib,"python34.lib")
# endif /* _DEBUG */
將DEBUG條件下的lib由python34_d.lib改爲python34.lib.
# if defined(_DEBUG)
# pragma comment(lib,"python34.lib")
所以這是下下策了,等我找到編譯生成python34_d.dll和python34_d.dll出錯的原因後再來補充。當然如果怕麻煩,之間用release版本就可以了,不用生成python34_d.lib。
還有一點就是我的python是64位的,因此還設置了VS的編譯平臺爲X64。
如果沒有設置,默認情況下是32位的,而我的python是64位的,會報如下錯誤:
都配置正確後下面是實現的代碼,比較簡單,就不詳細說了:
python代碼:
#helloworld.py
#Sherry
#2015/10/25
def HelloWorld():
print("hello, world!")
C++代碼:
#include "stdafx.h"
#include <Python.h>
int main()
{
Py_Initialize();//使用python之前,要調用Py_Initialize();這個函數進行初始化
PyObject * pModule = NULL;//聲明變量
PyObject * pFunc = NULL;// 聲明變量
PyObject * pArg = NULL;
pModule = PyImport_ImportModule("helloworld");//這裏是要調用的文件名
pFunc = PyObject_GetAttrString(pModule, "HelloWorld");//這裏是要調用的函數名
PyEval_CallObject(pFunc, NULL);//調用函數
Py_Finalize();//調用Py_Finalize,這個根Py_Initialize相對應的。
system("pause");
return 0;
}
把前面寫好的helloworld.py文件放在.cpp和.h所在的文件夾下,然後編譯運行。
執行結果:
本文只是簡單的hello world示例,沒有參數的傳輸過程,比較簡單,後面有時間了再補充有參數的情況以及使用諸如SWIG等工具進行python和C/C++相互擴展的方法。
Ref:
http://blog.csdn.net/c_cyoxi/article/details/23978007
http://blog.csdn.net/c_cyoxi/article/details/23969203
http://www.cppblog.com/API/archive/2013/04/25/199720.aspx
From:
http://blog.csdn.net/sherrylml/article/details/49405257