我有一个第三方,封闭源库作为使用visual studio 2010构建的windows dll。 首先,我计划使用例如为该dll构建扩展模块。痛饮。 然而,它被VS 2010构建的事实破坏了,而所有的python 2发行版都是用VS 2008构建的。
现在似乎ctypes没有这个限制。
我使用VS 2010构建了一个简单的dll(依赖性walker显示dll链接到msvcr100.dll
)并带有一个函数:
int fnTestLib2(int a, int b)
{
return a+b;
}
将其加载到ctypes和
fcn = mydll.fnTestLib2
fcn.argtypes = [ctypes.c_int, ctypes.c_int]
fcn.restype = ctypes.c_int
print fcn(1,2)
正确打印3
。
现在,我有点困惑:
这只是因为我很幸运,因为这个例子很简单,或者ctypes
和扩展模块的基础技术有根本区别吗?
如果是,那是什么? ;)
最后:为第三方dll实现ctypes包装器库是否安全?
修改 根据Serge的回答,我使用distutils和Windows SDK编译了我的swig扩展。 所以,现在我有我的扩展bla.pyd,它确实似乎工作。 虽然我想知道这两个c运行时的依赖性是否值得推荐。用依赖性walker看它:
答案 0 :(得分:1)
我不是SWIG的专家而不是ctypes,但是当我年轻的时候我经常在Windows中苦苦挣扎。
首先,你的例子太琐碎了。由于您没有从标准库中调用任何函数,因此即使路径中没有mscvr100.dll
,该示例也可以正常工作。您至少应该尝试使用一个简单的函数,例如strlen
(不是lstrlen
,这将是一个Windows API函数...):
#include <string.h>
int testfunc(char *str) {
return strlen(str);
}
我无法测试,因为我目前没有VS2013编译器。
接下来,SWIG和ctypes之间存在重大差异:
由于ctypes直接连接一个dll,你不应该担心编译dll的编译器,也不要担心它使用哪个其他dll 如果它们在路径上。如果它必须使用静态库(xxx.a),那将是非常不同的,因为在这种情况下,库格式应该是兼容的。您只需要知道使用什么调用约定(stdcall或cdecl)来知道是否应该使用windll或cdll(分别)。
顺便说一句,根据SO How to create a DLL with SWIG from Visual Studio 2010上的其他帖子,也可以使用VisualStudio 2010为Python创建扩展dll。这是正常的,因为从python方面来看,扩展库只是一个dll它使用它,但困难的部分是从VisualStudio环境访问Python DLL。