C++調用python:無參數,簡單helloworld示例

運行環境:VS2015 + python3.4
總體步驟簡單來說如下:

  1. 設置編譯環境,其實就是設置Python的頭文件和庫文件目錄以及一個很讓人頭疼的python3.4_d.lib問題
  2. 初始化Python解釋器: Py_Initialize();
  3. 調用Python
  4. 釋放資源 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

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