Как мне импортировать winDLL в python и использовать все его функции? Ему нужны только удвоения и строки.
Python import dll
Ответ 1
Вы отметили вопрос 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))
Ответ 2
Я отправляю свой опыт. Прежде всего, несмотря на всю тяжелую работу, которая заставляет меня объединять все части, импортировать С# dll легко. Как я это сделал:
1) Установите этот пакет nuget (я не владелец, это очень полезно), чтобы построить неуправляемую dll: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports
2) Код вашей 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 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 it now you can test it
print(MyFunctionObject("Python Message"))
Ответ 3
Используйте Cython, как для доступа к DLL, так и для создания привязок Python для них.
Ответ 4
c-типы ПРИМЕЧАНИЕ!
Использование WinDLL
(и wintypes
, msvcrt
) - импорт, специфичный для Windows, и не всегда работает, даже на Windows! Причина в том, что это зависит от вашей установки Python. Это родная Windows (или использующая Cygwin или WSL)?
Для ctypes более переносимым и правильным способом является использование cdll
следующим образом:
import sys
import ctypes
from ctypes import cdll, c_ulong
kFile = 'C:\\Windows\\System32\\kernel32.dll'
mFile = 'C:\\Windows\\System32\\msvcrt.dll'
try:
k32 = cdll.LoadLibrary(kFile)
msvcrt = cdll.LoadLibrary(mFile)
except OSError as e:
print("ERROR: %s" % e)
sys.exit(1)
# do something...