C++調用Python腳本中的函數


1.環境配置

安裝完python后,把python的include和lib拷貝到自己的工程目錄下

image

然后在工程中包括進去

imageimage

 

2.例子

先寫一個python的測試腳本,如下

image

這個腳本里面定義了兩個函數Hello()和_add()。我的腳本的文件名叫mytest.py

C++代碼:

#include "stdafx.h"  
#include <stdlib.h>
#include <iostream>  

#include "include\Python.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    //初始化Python環境  
    Py_Initialize();

    PyRun_SimpleString("import sys");
    //添加Insert模塊路徑  
    //PyRun_SimpleString(chdir_cmd.c_str());
    PyRun_SimpleString("sys.path.append('./')");

    //導入模塊  
    PyObject* pModule = PyImport_ImportModule("mytest");

    if (!pModule)
    {
        cout << "Python get module failed." << endl;
        return 0;
    }

    cout << "Python get module succeed." << endl;

    PyObject * pFunc = NULL;
    pFunc = PyObject_GetAttrString(pModule, "Hello");
    PyEval_CallObject(pFunc, NULL);

    //獲取Insert模塊內_add函數  
    PyObject* pv = PyObject_GetAttrString(pModule, "_add");
    if (!pv || !PyCallable_Check(pv))
    {
        cout << "Can't find funftion (_add)" << endl;
        return 0;
    }
    cout << "Get function (_add) succeed." << endl;

    //初始化要傳入的參數,args配置成傳入兩個參數的模式  
    PyObject* args = PyTuple_New(2);
    //將Long型數據轉換成Python可接收的類型  
    PyObject* arg1 = PyLong_FromLong(4);
    PyObject* arg2 = PyLong_FromLong(3);

    //將arg1配置為arg帶入的第一個參數  
    PyTuple_SetItem(args, 0, arg1);
    //將arg1配置為arg帶入的第二個參數  
    PyTuple_SetItem(args, 1, arg2);

    //傳入參數調用函數,並獲取返回值  
    PyObject* pRet = PyObject_CallObject(pv, args);

    if (pRet)
    {
        //將返回值轉換成long型  
        long result = PyLong_AsLong(pRet);
        cout << "result:" << result << endl ;
    }

    Py_Finalize();

    system("pause");

    return 0;
}

注意腳本放的位置,確保C++代碼可以引用它。

運行結果:

image

 

3.python代碼處理

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

以上的Debug目錄中的exe要想能夠單獨運行,必須把python腳本拷過去。為了不讓別人能直接看到我的代碼,我拷過去的是生成的.pyc文件

image

拷過去之后修改文件名為:

image

實現了一個簡單的python代碼的加密。

不過據說可以反編譯,但是對我來說已經夠了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM