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

1.環境配置

安裝完python後,把python的include和lib拷貝到本身的工程目錄下python

image

而後在工程中包括進去ios

imageimage

 

2.例子

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

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++代碼能夠引用它。加密

運行結果:spa

image

 

3.python代碼處理

在發佈軟件的時候,一般咱們都不但願代碼能夠直接被別人看到。code

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

image

拷過去以後修改文件名爲:get

image

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

不過聽說能夠反編譯,可是對我來講已經夠了。

相關文章
相關標籤/搜索