Python导入dll

时间:2011-03-09 23:56:20

标签: python dll ctypes

如何将winDLL导入python并能够使用其所有功能?它只需要双打和字符串。

4 个答案:

答案 0 :(得分:17)

您已对问题ctypes进行了标记,因此听起来您已经知道了答案。

ctypes tutorial很棒。一旦你阅读并理解了你将能够轻松地完成它。

例如:

>>> from ctypes import *
>>> windll.kernel32.GetModuleHandleW(0)
486539264

我自己的代码中的一个例子:

lib = ctypes.WinDLL('mylibrary.dll')
#lib = ctypes.WinDLL('full/path/to/mylibrary.dll')
func = lib['myFunc']#my func is double myFunc(double);
func.restype = ctypes.c_double
value = func(ctypes.c_double(42.0))

答案 1 :(得分:3)

我发布了我的经历。首先,尽管我将所有部分放在一起所做的艰苦工作,但导入C#dll很容易。我这样做的方式是:

1)安装这个nuget包(我不是所有者,非常有用),以便构建一个非托管的dll:https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

2)你的C#DLL代码是这样的:

using System;
using RGiesecke.DllExport;
using System.Runtime.InteropServices;

public class MyClassName
{
   [DllExport("MyFunctionName",CallingConvention = CallingConvention.Cdecl)]
   [return: MarshalAs(UnmanagedType.LPWStr)]
   public static string MyFunctionName([MarshalAs(UnmanagedType.LPWStr)] string iString)
   {
       return "hello world i'm " + iString
   }
}

3)你的python代码是这样的:

import ctypes
#Here you load the dll into python 
MyDllObject = ctypes.cdll.LoadLibrary("C:\\My\\Path\\To\\MyDLL.dll")
#it's important to assing the function to an object
MyFunctionObject = MyDllObject.MyFunctionName
#define the types that your C# function return
MyFunctionObject.restype = ctypes.c_wchar_p
#define the types that your C# function will use as arguments
MyFunctionObject.argtypes = [ctypes.c_wchar_p]
#That's it now you can test it
print(MyFunctionObject("Python Message"))

答案 2 :(得分:2)

使用Cython来访问DLL,并为它们生成Python绑定。

答案 3 :(得分:1)

c型注意!

使用[mm]:ss(和WinDLLwintypes)是Windows特定的导入,即使在Windows上也不一定总是有效!原因是它取决于您的python安装。它是本机Windows(还是使用Cygwin或WSL)?

对于 ctypes ,更可移植且更正确的方法是像这样使用msvcrt

cdll