前言
最近經常會遇到這樣一個case:在visual studio裏面需要將某個二維數組保存成numpy文件或者反過來,需要將某個numpy文件load成mat數組。這裏面涉及到在visual sutdio裏面如何調用python腳本來實現前面提到的功能。
visual studio配置python環境
包含目錄添加python的include路徑
庫目錄添加python庫路徑:
環境變量添加python路徑:
python腳本
在visual studio裏面調用python腳本里面的函數之前,需要先把python腳本內容準備好,其實就是一系列功能函數的實現,如下圖所示是numpy_file.py裏面的內容。
import numpy as np
import os
def save_to_right_mapy_file(np_array):
#print("shape of np_array", np_array.shape)
np.save('./right/mapy.npy', np_array)
def load_numpy_file(np_file):
return np.load("./disparities_pp.npy")
#return np.load(np_file)
python初始化代碼
主要用來初始化python系統,並加載python代碼文件
/*初始化Python
在使用Python系統前,必須使用Py_Initialize對其
進行初始化。它會載入Python的內建模塊並添加系統路
徑到模塊搜索路徑中。這個函數沒有返回值,檢查系統
是否初始化成功需要使用Py_IsInitialized。*/
Py_Initialize();
import_array();
// 檢查初始化是否成功
if (!Py_IsInitialized())
{
return -1;
}
PyRun_SimpleString("import sys");
PyRun_SimpleString("sys.path.append('./')");
s_pModule = PyImport_ImportModule("numpy_file");
if (s_pModule == NULL)
{
return -1;
}
s_pDict = PyModule_GetDict(s_pModule);
if (s_pDict == NULL)
{
return -1;
}
python功能函數的調用
前面步驟做好後,就可以在visual studio實現對python腳本里面的函數進行調用。
下面代碼演示的是對save_to_right_mapy_file()的調用。
/*Pass by Python Array: Transform an C Array to Python Array*/
npy_intp Dims[2] = { matrix.rows, matrix.cols };
s_pPyArray = PyArray_SimpleNewFromData(2, Dims, NPY_FLOAT, (float *)matrix.data);
PyObject *ArgArray = PyTuple_New(1);
PyTuple_SetItem(ArgArray, 0, s_pPyArray);
PyObject *pFunc = nullptr;
pFunc = PyDict_GetItemString(s_pDict, "save_to_right_mapy_file");
if (pFunc == nullptr)
{
return -1;
}
PyObject_CallObject(pFunc, ArgArray);
//Release
Py_DECREF(ArgArray);