Heim > Artikel > Backend-Entwicklung > Hat jemand versucht, die Python-Bindungen von LibHaru auf Python 3.9 (64-Bit) zu aktualisieren?
Ich verwende Python 3.9, 64-Bit, und habe VS 2022 verwendet, um libharu und einige Erweiterungen in eine DLL zu kompilieren, einschließlich libpng. Nach dem Hinzufügen minimaler Codeanpassungen zum Auffinden der VS-Laufzeit-DLL (libhpdf) kann die DLL in Python geladen werden. dll-Abhängigkeit und scheint zu funktionieren (nur 5 .py-Dateien im Paket) Ich habe eine DLL mit aktiviertem PTRACE erstellt, um den Fortschritt zu verfolgen. Mit dieser DLL wurden auch C-Demos dynamisch erstellt, die alle funktionieren und PDFs generieren.
Ich versuche, das in der Bindung enthaltene Python-Demobeispiel arc_demo.py auszuführen Möchten Sie dieselbe PDF-Datei generieren?
Ich kann sagen, dass alles gut funktioniert, bis ich die Zeile aus der Dokumentation hinzufüge:
Ausgabe ähnlich der Ablaufverfolgung, die mit der kompilierten C-Version des Beispiels erhalten wurde. pdf = HPDF_New (error_handler, NULL)
Ich bin auf Folgendes gestoßen:
page = HPDF_AddPage (pdf)
**ctypes.ArgumentError:参数 1:a04cf49bbeb5568f1f5e32599834036a:int 太长,无法转换**
Jetzt ändere ich also die Bindungen, hauptsächlich
hpdf.py.
Ich habe derzeit Probleme mit der Kommunikation zwischen Python und DLL und überprüfe, ob ctypes die Dinge wie erwartet verarbeitet. Mit ...kein Glück. Wenn der Aufruf über ref(c_void_p(pdf)) erfolgt, werde ich den Fehler beseitigen, kann aber nicht richtig auf den Inhalt der HPDF_Doc-Struktur zugreifen byref
,将 *pdf * 转换为 c_void_p
Danke, Ignacio
PS: Irgendwann werden Kurse für Haru PDF-Interna geschrieben. Dies geschieht jedoch, nachdem ich das Python-Beispiel ohne Fehler ausführen kann.
Aufrufkonvention und Sie müssen die Parametergröße kennen. if/python/hpdf.py
中的ctypes
接口没有为所有函数定义.argtypes
。对于 64 位句柄和指针来说,为每个函数定义正确的参数类型尤其重要。最初的开发人员可能不明白这一点,如从 windll
转换为 cdll
接口所示。 windll
使用 __stdcall
definiert als: hpdf_doc
被定义为 hpdf_handle
,它被定义为 ctypes.c_void_p
。这是 64 位操作系统上的 64 位指针。 hpdf_new
和 hpdf_addpage
#hpdf_doc hpdf_new (hpdf_error_handler user_error_fn, void *user_data) hpdf_new=haru.hpdf_new hpdf_new.restype=hpdf_doc #hpdf_page hpdf_addpage (hpdf_doc pdf) hpdf_addpage=haru.hpdf_addpage hpdf_addpage.restype=hpdf_page
Kann Typprüfungen durchführen und Parameter von Python-Objekten korrekt in C-Typen marshalieren (konvertieren), zum Beispiel: ctypes
假设传递给 hpdf_addpage
的参数是 c_int
因为 to 没有 argtypes。句柄值是 >32 位,因此出现错误。理想情况下,所有函数都应显式声明其参数类型,以便 ctypes
HPDF_AddPage.argtypes = HPDF_Doc, # must be a list or tuple...comma makes this a 1-tuple. HPDF_New.argtypes = HPDF_Error_Handler, c_void_pBitte beachten Sie, dass Parametertypen auf
basieren müssen. ctypes
类型。您必须仔细跟踪参数并为每个函数声明 .argtypes
Das obige ist der detaillierte Inhalt vonHat jemand versucht, die Python-Bindungen von LibHaru auf Python 3.9 (64-Bit) zu aktualisieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!