最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++調(diào)用Python代碼的方法步驟

 更新時(shí)間:2020年02月07日 09:06:56   作者:風(fēng)向晚。  
這篇文章主要介紹了使用C++調(diào)用Python代碼的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一、配置python環(huán)境問(wèn)題

1.首先安裝Python(版本無(wú)所謂),安裝的時(shí)候選的添加python路徑到環(huán)境變量中

安裝之后的文件夾如下所示:

2.在VS中配置環(huán)境和庫(kù)

右擊項(xiàng)目->屬性->VC++目錄

1)包含目錄:

Python安裝路徑/include

2)庫(kù)目錄:

Python安裝路徑/libs

右擊項(xiàng)目->屬性->連接器->輸入->附加依賴庫(kù)

debug下:

python安裝目錄/libs/python37_d.lib

release下:

python安裝目錄/libs/python37.lib

注意

1、debug配置的時(shí)候可能沒(méi)有python37_d.lib,那就把python37.lib復(fù)制一個(gè),然后重命名為python37_d.lib就可以啦

2、如果一直報(bào)錯(cuò),但是包含頭文件等都沒(méi)有問(wèn)題,那么你需要看一下你的python是32位還是64位的。然后根據(jù)python的環(huán)境去配置vs的環(huán)境。

二、C++調(diào)用python函數(shù)并輸出返回值

首先可能有個(gè)坑!一定要保證這個(gè)python函數(shù)所在的文件能夠正常運(yùn)行!然后把python代碼放到和C++代碼同一目錄下。

1、定義Python函數(shù)

#!python3
# -*- coding:utf-8 -*-
import base64
import hmac
from hashlib import sha1

def hash_hmac(code , key):
 #sha1加密簽名算法
 hmac_code = hmac.new(key.encode() , code.encode() , sha1).digest()
 return base64.b64encode(hmac_code).decode()

2、編寫C++代碼

#include <iostream>
#include<python.h>
using namespace std;
int main()
{

 Py_Initialize();//使用python之前,要調(diào)用Py_Initialize();這個(gè)函數(shù)進(jìn)行初始化
 if (!Py_IsInitialized())
 {
  printf("初始化失??!");
  return 0;
 }

 PyRun_SimpleString("import sys");
 PyRun_SimpleString("sys.path.append('./')");//這一步很重要,修改Python路徑


 PyObject* pModule = NULL;//聲明變量
 PyObject* pFunc = NULL;// 聲明變量

 pModule = PyImport_ImportModule("hash_hmac");//這里是要調(diào)用的文件名hash_hmac.py
 if (pModule == NULL)
 {
  cout << "沒(méi)找到" << endl;
 }

 pFunc = PyObject_GetAttrString(pModule, "hash_hmac");//這里是要調(diào)用的函數(shù)名
 //兩個(gè)字符串參數(shù)
 PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh2XRcZZqNyDweU4GRnM690");
 char* result;
 PyObject* pRet = PyObject_CallObject(pFunc, pParams);//調(diào)用函數(shù)

 int res = 0;
 PyArg_Parse(pRet, "s", &result);//轉(zhuǎn)換返回類型

 cout << "res:" << result << endl;//輸出結(jié)果

 Py_Finalize();//調(diào)用Py_Finalize,這個(gè)根Py_Initialize相對(duì)應(yīng)的。

 return 0;
}

3、解釋部分C++代碼

PyObject* pParams = Py_BuildValue("(ss)", "/oss/upload?bucket=test&filekey=test/image/3b/3ba9d94cab2f8868823d71c4445e125a.png\n" , "q4mJAS777BUbbdVpEqh2XRcZZqNyDweU4GRnM690");

在這里我輸入了兩個(gè)字符串類型的參數(shù),Py_BuildValue()函數(shù)的作用和PyArg_ParseTuple()的作用相反,它將C類型的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成Python對(duì)象。

該函數(shù)可以和PyArg_ParseTuple()函數(shù)一樣識(shí)別一系列的格式串,但是輸入?yún)?shù)只能是值,而不能是指針。

它返回一個(gè)Python對(duì)象和PyArg_ParseTuple()不同的一點(diǎn)是PyArg_ParseTuple()函數(shù)它的第一個(gè)參數(shù)為元組,Py_BuildValue()則不一定會(huì)生成一個(gè)元組。它生成一個(gè)元組僅僅當(dāng)格式串包含兩個(gè)或者多個(gè)格式單元,如果格式串為空,返回NONE。

在下面的描述中,括號(hào)中的項(xiàng)是格式單元返回的Python對(duì)象類型,方括號(hào)中的項(xiàng)為傳遞的C的值的類型。

“s” (string) [char *] :將C字符串轉(zhuǎn)換成Python對(duì)象,如果C字符串為空,返回NONE。

“s#” (string) [char *, int] :將C字符串和它的長(zhǎng)度轉(zhuǎn)換成Python對(duì)象,如果C字符串為空指針,長(zhǎng)度忽略,返回NONE。

“z” (string or None) [char *] :作用同”s”。

“z#” (string or None) [char *, int] :作用同”s#”。

“i” (integer) [int] :將一個(gè)C類型的int轉(zhuǎn)換成Python int對(duì)象。

“b” (integer) [char] :作用同”i”。

“h” (integer) [short int] :作用同”i”。

“l(fā)” (integer) [long int] :將C類型的long轉(zhuǎn)換成Pyhon中的int對(duì)象。

“c” (string of length 1) [char] :將C類型的char轉(zhuǎn)換成長(zhǎng)度為1的Python字符串對(duì)象。

“d” (float) [double] :將C類型的double轉(zhuǎn)換成python中的浮點(diǎn)型對(duì)象。

“f” (float) [float] :作用同”d”。

“O&” (object) [converter, anything] :將任何數(shù)據(jù)類型通過(guò)轉(zhuǎn)換函數(shù)轉(zhuǎn)換成Python對(duì)象,這些數(shù)據(jù)作為轉(zhuǎn)換函數(shù)的參數(shù)被調(diào)用并且返回一個(gè)新的Python對(duì)象,如果發(fā)生錯(cuò)誤返回NULL。

“(items)” (tuple) [matching-items] :將一系列的C值轉(zhuǎn)換成Python元組。

“[items]” (list) [matching-items] :將一系列的C值轉(zhuǎn)換成Python列表。

“{items}” (dictionary) [matching-items] :將一系類的C值轉(zhuǎn)換成Python的字典,每一對(duì)連續(xù)的C值將轉(zhuǎn)換成一個(gè)鍵值對(duì)。

例如:

Py_BuildValue(“”) None

Py_BuildValue(“i”, 123) 123

Py_BuildValue(“iii”, 123, 456, 789) (123, 456, 789)

Py_BuildValue(“s”, “hello”) ‘hello'

Py_BuildValue(“ss”, “hello”, “world”) (‘hello', ‘world')

Py_BuildValue(“s#”, “hello”, 4) ‘hell'

Py_BuildValue(“()”) ()

Py_BuildValue(“(i)”, 123) (123,)

Py_BuildValue(“(ii)”, 123, 456) (123, 456)

Py_BuildValue(“(i,i)”, 123, 456) (123, 456)

Py_BuildValue(“[i,i]”, 123, 456) [123, 456] Py_BuildValue(“{s:i,s:i}”, “abc”, 123, “def”, 456) {‘a(chǎn)bc': 123, ‘def': 456}

Py_BuildValue(“((ii)(ii)) (ii)”, 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))

3、運(yùn)行C++程序

與Python代碼的預(yù)期相同。

三、Python代碼處理

在發(fā)布軟件的時(shí)候,通常我們都不希望代碼可以直接被別人看到。

以上的Debug目錄中的exe要想能夠單獨(dú)運(yùn)行,必須把python腳本拷過(guò)去。為了不讓別人能直接看到我的代碼,我拷過(guò)去的是生成的.pyc文件,實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的python代碼的加密。不過(guò)據(jù)說(shuō)可以反編譯,但是對(duì)我來(lái)說(shuō)已經(jīng)夠了。

四、.py和.pyc的區(qū)別

原來(lái)Python的程序中,是把原始程序代碼放在.py文件里,而Python會(huì)在執(zhí)行.py文件的時(shí)候。將.py形式的程序編譯成中間式文件(byte-compiled)的.pyc文件,這么做的目的就是為了加快下次執(zhí)行文件的速度。

所以,在我們運(yùn)行python文件的時(shí)候,就會(huì)自動(dòng)首先查看是否具有.pyc文件,如果有的話,而且.py文件的修改時(shí)間和.pyc的修改時(shí)間一樣,就會(huì)讀取.pyc文件,否則,Python就會(huì)讀原來(lái)的.py文件。

其實(shí)并不是所有的.py文件在與運(yùn)行的時(shí)候都會(huì)產(chǎn)生.pyc文件,只有在import相應(yīng)的.py文件的時(shí)候,才會(huì)生成相應(yīng)的.pyc文件。

五、使用.py生成.pyc

在命令行下使用下列命令即可:

python -m py_compile test.py#單文件

python -m py_compile /root/src/{file1,file2}.py#多文件

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C語(yǔ)言實(shí)現(xiàn)賓果消消樂(lè)

    C語(yǔ)言實(shí)現(xiàn)賓果消消樂(lè)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)賓果消消樂(lè),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • C語(yǔ)言返回值指針的函數(shù)詳解

    C語(yǔ)言返回值指針的函數(shù)詳解

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言返回值指針的函數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++ 函數(shù)重載詳情介紹

    C++ 函數(shù)重載詳情介紹

    這篇文章主要介紹了C++ 函數(shù)重載詳情,函數(shù)重載還有一個(gè)別名叫函數(shù)多態(tài),函數(shù)多態(tài)是C++在C語(yǔ)言基礎(chǔ)上的新特性,它可以讓我們使用多個(gè)同名函數(shù),下面來(lái)看看文章具體內(nèi)容的介紹
    2021-11-11
  • C程序中唯一序列號(hào)的生成實(shí)例詳解

    C程序中唯一序列號(hào)的生成實(shí)例詳解

    這篇文章主要介紹了C程序中唯一序列號(hào)的生成實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • C++11中強(qiáng)類型枚舉的使用

    C++11中強(qiáng)類型枚舉的使用

    本文主要介紹了C++11中強(qiáng)類型枚舉的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • C++開(kāi)發(fā)protobuf動(dòng)態(tài)解析工具

    C++開(kāi)發(fā)protobuf動(dòng)態(tài)解析工具

    這篇文章主要為大家介紹了C++開(kāi)發(fā)protobuf動(dòng)態(tài)解析工具實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖

    Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖

    這篇文章主要介紹了如何利用Matlab實(shí)現(xiàn)繪制有氣泡感的網(wǎng)絡(luò)圖,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下
    2023-02-02
  • C++中new和delete的使用方法詳解

    C++中new和delete的使用方法詳解

    這篇文章主要介紹了C++中new和delete的使用方法詳解的相關(guān)資料,希望通過(guò)本文能幫助到大家,需要的朋友可以參考下
    2017-10-10
  • C++原地刪除有序數(shù)組重復(fù)項(xiàng)的N種方法

    C++原地刪除有序數(shù)組重復(fù)項(xiàng)的N種方法

    給定一個(gè)排序數(shù)組,你需要在原地刪除重復(fù)出現(xiàn)的元素,使得每個(gè)元素只出現(xiàn)一次,返回移除后數(shù)組的新長(zhǎng)度,不要使用額外的數(shù)組空間,你必須在 原地 修改輸入數(shù)組 并在使用O(1)額外空間的條件下完成,故本文介紹了C++原地刪除有序數(shù)組重復(fù)項(xiàng)的N種方法,需要的朋友可以參考下
    2025-03-03
  • typedef_struct與struct之間的區(qū)別

    typedef_struct與struct之間的區(qū)別

    本篇文章主要是對(duì)typedef struct與struct之間的區(qū)別進(jìn)行了介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12

最新評(píng)論

栖霞市| 阿克苏市| 湾仔区| 临夏县| 瑞昌市| 会泽县| 辰溪县| 阿图什市| 师宗县| 静海县| 德清县| 潜山县| 威远县| 安西县| 甘孜| 祁连县| 专栏| 百色市| 陆丰市| 庆安县| 视频| 凌云县| 石城县| 新巴尔虎右旗| 鲁甸县| 泉州市| 静海县| 延安市| 宜黄县| 临汾市| 泰州市| 渭南市| 青田县| 上犹县| 长垣县| 烟台市| 饶平县| 封开县| 汝阳县| 钟山县| 万盛区|