web-dev-qa-db-fra.com

DLL d'importation Python

Comment importer une winDLL en python et pouvoir utiliser toutes ses fonctions? Il n'a besoin que de doubles et de chaînes.

15
pajm

Vous avez marqué la question ctypes et vous semblez donc connaître la réponse.

Le didacticiel ctypes est excellent. Une fois que vous avez lu et compris que vous pourrez le faire facilement.

Par exemple:

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

Et un exemple de mon propre code:

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))
16
David Heffernan

Je poste mon expérience. Tout d’abord, malgré tout le travail ardu qui m’a amené à assembler toutes les pièces, importer une dll C # est facile. La façon dont je l'ai fait est:

1) Installez ce paquet nuget (je ne suis pas propriétaire, c’est très utile) pour créer une dll non gérée: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports

2) Votre code dll C # ressemble à ceci:

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) Votre code python est comme ceci:

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"))
3
piloks_aiti

Utilisez Cython , les deux pour accéder aux DLL et générer des liaisons Python pour elles.

2
Apalala

c-types NOTE!

Utiliser WinDLL (et wintypes, msvcrt) est une importation spécifique à Windows et ne fonctionne pas toujours, même sous windows! La raison en est que cela dépend de votre installation de python. Est-ce Windows natif (ou utilisant Cygwin ou WSL)? 

Pour ctypes , le moyen le plus portable et correct consiste à utiliser cdll comme ceci:

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...
1
not2qubit