Python import dll

Как мне импортировать winDLL в python и использовать все его функции? Ему нужны только удвоения и строки.

Ответ 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-типы ПРИМЕЧАНИЕ!

Использование WinDLLwintypes, 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...