Ich möchte einige Funktionen von einer externen DLL mit Python3 unter Windows aufrufen. Die Bibliothek und die Funktionen, die ich verwenden möchte, sind wie folgt;Ctypes, Aufruf einer externen windll-Funktion
MECAB_DLL_EXTERN mecab_t* mecab_new2(const char *arg);
MECAB_DLL_EXTERN const char* mecab_sparse_tostr(mecab_t *mecab, const char *str);
MECAB_DLL_EXTERN void mecab_destroy(mecab_t *mecab);
Ich brauche ersten mecab_new2
zu nennen, um den Zeiger von seiner Rückkehr bekommen und es auf mecab_sparse_tostr
verwenden, dann ist es schließlich entsorgen die gleichen Zeiger mit von mecab_destroy
aufrufen.
habe ich gefunden, dass die folgenden Werke in C# (wenn es hilft als Referenz):
[DllImport(@"C:\libmecab.dll", CallingConvention = CallingConvention.Cdecl)]
private extern static IntPtr mecab_new2(string arg);
[DllImport(@"C:\libmecab.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Unicode)]
private extern static IntPtr mecab_sparse_tostr(IntPtr m, byte[] str);
...
{
IntPtr mecab = mecab_new2("-Owakati"); // returns a pointer
mecab_sparse_tostr(mecab, Encoding.UTF8.GetBytes(input));
konnte aber nicht eine ähnliche Art und Weise in Python trainieren. Ich habe das folgende mit verschiedenen restypes und argtypes versucht. Aber die mecab_new2
Funktion gibt immer 0 zurück (ich nehme an, es ist Null?).
import ctypes
mecab_dll = ctypes.WinDLL(r"C:\libmecab.dll")
mecab_new2 = mecab_dll['mecab_new2']
mecab_new2.restype = ctypes.POINTER(ctypes.c_int)
mecab_new2.argtypes = [ctypes.c_char_p]
p1 = ctypes.c_char_p(b"-Owakati")
res = mecab_new2(p1)
print(res.contents)
# ValueError: NULL pointer access
Wenn ich entfernen Sie das restype Argument es 0 zurückgibt, mit restype = ctypes.POINTER(ctypes.c_int)
es einen Null-Zeiger zurückgibt.
Ich habe ähnliche Fragen und die Dokumentation durchsucht, konnte aber nicht finden, wie. Bin sehr schlecht mit C++ und damit auch mit Ctypes.
Danke.
EDIT: ich eine andere Funktion aus der Bibliothek versucht haben, eine, die keine Argumente benötigen und es funktionierte richtig aus. Also nehme ich an, dass mein Problem mit nicht passenden Argumenten liegt? oder die Bibliothek ist irgendwie kaputt?
Headerdatei:
MECAB_DLL_EXTERN const char* mecab_version();
Python-Code:
mecab_ver = mecab_dll["mecab_version"]
mecab_ver.restype = ctypes.c_char_p
print(mecab_ver()) # returns b'0.996' which is correct
Danke für die Antwort, das macht wirklich viel Sinn. Aber ich habe immer noch das gleiche Ergebnis, indem ich 'mecab_dll = ctypes.CDLL (r" C: \ libmecab.dll ")' aufruft. Es wirft 'NULL Zeigerzugriffsfehler 'auf. – umutto
Ich habe gerade ein paar Updates gemacht, die helfen könnten - es sieht auch so aus, als würden Sie einen Zeiger auf eine Zeichenfolge (char **) anstelle einer Zeichenfolge (char *) an Ihre mecab_new2-Funktion übergeben. – iUknwn
Nochmals vielen Dank für Ihre Antwort! Nicht wirklich zu wissen, was zu tun ist, staute jede Lösung, die ich finden kann =). Leider hat sich das Ergebnis beim Editieren nicht geändert, es wird immer noch ein NULL-Zeiger zurückgegeben. – umutto