web-dev-qa-db-ja.com

PythonインポートDLL

どうすればwinDLLをpythonにインポートし、そのすべての関数を使用できるようになりますか?倍精度浮動小数点数と文字列のみが必要です。

18
pajm

あなたは質問 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))
18
David Heffernan

私の経験を投稿しています。まず第一に、すべての要素をまとめるのに苦労するすべての作業にもかかわらず、C#dllのインポートは簡単です。私がそれをした方法は:

1)管理されていないdllを構築するために、このnugetパッケージをインストールします(私は所有者ではないので、非常に便利です): 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"))
3
piloks_aiti

DLLにアクセスするためと、DLLのPythonバインディングを生成するための両方に Cython を使用します。

2
Apalala

c-types注!

WinDLL(およびwintypesmsvcrt)の使用は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...
1
not2qubit