这是一个简单的例子.使用ctypes,因为现在blender等3d软件 写插件只能用内置的python api,没有内置的C++ api,要用C++写插件,只能使用 py调用 C++的方式 实现.
下面编译为c_float.dll(因为使用了中文变量,所以最好用vc编译)
#include<stdio.h>
#define EXC extern "C" __declspec(dllexport)//●●定义这个接口,可以被py调用
EXC void Δ二维数组(int Lci__[])//定义一个数组并传入py
{
Lci__[0]=8;Lci__[1]=6;
}
EXC void Δ一维int(int &ci__)//定义一个int值并传入py
{
ci__=7;
}
#if(0)(<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
编译这个cpp文件为dll,可以通过vs,
也可以通过notepad++的插件NppExec,编译成dll的命令行为:
//-----RELEASE x64版本-------------------------------------------------
cmd /k chdir /d $(CURRENT_DIRECTORY) &cl $(FILE_NAME) /TP /W3 /Fo:$(NAME_PART).obj /c &EXIT
cmd /k chdir /d $(CURRENT_DIRECTORY) &link /SUBSYSTEM:WINDOWS /MACHINE:X64 /DLL $(NAME_PART).obj /OUT:$(NAME_PART).dll &EXIT
#endif>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
下面是python脚本.
运行直接就调用 了上面编译的dll.
from ctypes import*
from ctypes.wintypes import *
dll路径="c_float.dll";#载入 把c_float.cpp 编译成的dll文件
DLL=None;
def Δ载入dll(dll路径):
dll = CDLL(dll路径);
return dll;
def Δ卸载dll():
global DLL;
if(DLL):
windll.kernel32.FreeLibrary.argtypes = [HMODULE];
windll.kernel32.FreeLibrary(DLL._handle);#释放dll
DLL=None;
DLL=Δ载入dll(dll路径);
print("DLL",DLL);
Lci_=(c_int*2)();
DLL.Δ二维数组(Lci_);#从dll里传入数组的值并打印
for ci in Lci_:
print("ci L==",ci);#√ ci== 8,ci== 6
ci_=c_int();
DLL.Δ一维int(byref(ci_));#从dll里以引用 方式 传入int的值,如果要通过引用传值就用byref(ci_),如果只通过值传 可以直接用 ci_
print("ci_==",ci_);#Χci_== c_long(7)
print("ci_.value==",ci_.value);#√ci_== 7