1. 程式人生 > >C++呼叫python:無引數,簡單helloworld示例

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++相互擴充套件的方法。

相關推薦

C++呼叫python引數簡單helloworld示例

執行環境:VS2015 + python3.4 總體步驟簡單來說如下: 設定編譯環境,其實就是設定Python的標頭檔案和庫檔案目錄以及一個很讓人頭疼的python3.4_d.lib問題 初始化Python直譯器: Py_Initialize();

#10月份程式語言排行榜C++幹掉Python 重回前三Swift排行前十

TIOBE 釋出了 10 月份最新程式語言排行榜 在 9 月份的 TIOBE 程式語言排行榜中,Python 超越 C++,首次進入排行榜 TOP 3。事實上,無論在工業界還是學術界,Python 的使用者越來越多,尤其是近年來 —— 乃至可以預見的未來,在 AI 和資料分析這些熱門的領

10月份程式語言排行榜C++幹掉Python 重回前三Swift排行前十

TIOBE 釋出了 10 月份最新程式語言排行榜 在 9 月份的 TIOBE 程式語言排行榜中,Python 超越 C++,首次進入排行榜 TOP 3。事實上,無論在工業界還是學術界,Python 的使用者越來越多,尤其是近年來 —— 乃至可以預見的未來,在 AI 和資料分析這些熱門的領域,Py

c#呼叫python的四種方法(嘗試了四種只詳細講解本人成功的後兩種其餘方法只列出詳細用法請自行谷歌百度)

一、使用c#,nuget管理包上下載的ironPython安裝包      嘗試後發現,對引用了numpy等第三方庫的python程式碼,會報找不到模組xxx的錯誤,上網查證後發現此問題基本難以解決 二、使用c++程式呼叫python檔案,然後將其做成動態連結庫

C#呼叫非託管函式引數為Void* 時方法

This sample demonstrates how to pass data to an unmanaged function that expects a void pointer as an argument. The sample provides two solutions. The Voi

c++ 呼叫 python 例項 涉及 類 多引數 列表作為引數

1個解析ip的python程式碼,檔名為ipParser.py class IPParser: def __init__(self): pass def _parse_ip( self, line ): segs = line.split(".") if

C++呼叫 python 函式及返回值的處理【元組字串...】

http://www.cnblogs.com/DxSoft/archive/2011/04/01/2002676.html Python 指令碼  py_test.py : #coding:utf-8 def get_int( ): a = 10 b =

C++呼叫Python函式並傳入傳出引數

步驟 包含Python.h,引入python.lib Py_Initialize()初始化,結束時呼叫Py_Finalize() 匯入sys模組,新增python指令碼路徑 匯入指令碼檔案,從指令碼中匯入函式模組 構造入參,如果有三個引數就構造PyTupl

Python類屬性實例屬性私有屬性與靜態方法類方法實例方法

所有 參數 方法 rate self 類屬性 不能 anaconda 賦值 類屬性可以直接在方法中賦值,但 一、調用該屬性時,必須先調用該方法; 二、與 init 方法區別是,init方法只初始化一次,初始化完成後作為全局變量。在方法中賦值屬性,每次調用該方法,該屬性初始化

Pythonbreak語句for語句

break 語句 作用: 用於迴圈語句(while,for語句)中,用來終止當前迴圈語句 的執行. 說明: 當break語句執行後,此迴圈語句break之後的語句將不再執行 break 語句通常和if語句組合使用 break 語句終止迴圈時,迴圈語句的else子句的語句不會執行

C++呼叫Python 3.7.0

開發環境:Visual Studio 2015 + Python 3.7.0 一、在C++程式碼中寫Python指令碼 在C++中含有呼叫Python指令碼的API函式,在C++程式碼中嵌入Python指令碼程式碼,是通過PyRun_SimpleString()函式實現。它允許將Pyth

Python進階(六)-python編寫引數decorator

分享一下我的偶像大神的人工智慧教程!http://blog.csdn.net/jiangjunshow 也歡迎轉載我的文章,轉載請註明出處 https://blog.csdn.net/mm2zzyzzp Python進階(六)-python編寫無引數decor

python 閉包匿名函式decorater裝飾器

#python閉包 封裝 提高程式碼複用 內層函式引用外層函式的變數,返回內層函式 返回函式不可以為迴圈變數 示例1: #標準線不同時,判斷學生的成績是否通過 方法1: def pass_60(val) : #標準線為60時,判斷是否通過 pas

C++】STLmap引數解析

如果基礎薄弱,那麼在看這篇部落格時,請先檢視map的例子。 map 是一種有序無重複的關聯容器。 關聯容器與順序容器不同,他們的元素是按照關鍵字來儲存和訪問的,而順序元素是按照它們在容器中的位置儲存和訪問的。 map儲存的是一種 key - value 的pair物件,其中

淺析 C++ 呼叫 Python 模組

淺析 C++ 呼叫 Python 模組 作為一種膠水語言,Python 能夠很容易地呼叫 C 、 C++ 等語言,也能夠通過其他語言呼叫 Python 的模組。 Python 提供了 C++ 庫,使得開發者能很方便地從 C++ 程式中呼叫 Python 模組。 具體的文件參考

C++ 呼叫Python(Pyc檔案)

原文地址:https://blog.csdn.net/horizons_kong/article/details/79030183 注:本文預設已經正確安裝Python3.4 1.編輯PythonLib.py檔案,內容如下(主要定義了兩個函式): 2.執行cmd視窗,定位到Pyth

C++解析(6)函式引數的擴充套件

0.目錄 1.函式引數的預設值 2.函式預設引數的規則 3.函式佔位引數 4.小結 1.函式引數的預設值 C++可以在函式宣告時為引數提供一個預設值 當函式呼叫時沒有提供引數的值,則使用預設值 引數的預設值必須在函式宣告中指定: 執行以下程式: #include <

python正則表示式簡單的郵箱格式驗證

做一個簡單的郵箱格式驗證的功能: #郵箱格式的匹配: import re mail = re.compile('^www\.\w{1,15}@\w{1,10}\.(com|cn|net)$') m = input('請輸入網址:') if re.search(mail, m): p

一行程式碼搞定安卓全螢幕適配——簡單粗暴-低入侵繼承簡單高效

話不多說,先上解決方案 方案一(推薦)  1.引用工具類       DensityHelper.java 2.在自定義的 Application onCreate 方法中加入     new Dens

致專案經理衝突不專案

現代專案管理認為:衝突是不可避免的。在專案管理軟技能調查中發現,衝突管理僅次於領導力排在第二位。由此可見,專案經理需要花很多時間在衝突管理上。 01 大多數情況下,衝突總是因人而起。認識衝突的起因和來源有助於更好地解決專案衝突。專案衝突主要有以下幾種來源:   專案組織衝突