วิธีที่ง่ายที่สุดในการใช้DLL
ไฟล์จากภายในPython
คืออะไร?
โดยเฉพาะวิธีนี้สามารถทำได้โดยไม่ต้องเขียนC++
โค้ดwrapper เพิ่มเติมเพื่อแสดงฟังก์ชั่นPython
?
พื้นเมืองPython
ฟังก์ชันการทำงานที่เป็นที่ต้องการอย่างมากมากกว่าการใช้ห้องสมุดของบุคคลที่สาม
วิธีที่ง่ายที่สุดในการใช้DLL
ไฟล์จากภายในPython
คืออะไร?
โดยเฉพาะวิธีนี้สามารถทำได้โดยไม่ต้องเขียนC++
โค้ดwrapper เพิ่มเติมเพื่อแสดงฟังก์ชั่นPython
?
พื้นเมืองPython
ฟังก์ชันการทำงานที่เป็นที่ต้องการอย่างมากมากกว่าการใช้ห้องสมุดของบุคคลที่สาม
คำตอบ:
เพื่อความสะดวกในการใช้งานctypesเป็นวิธีที่จะไป
ตัวอย่างของ ctypes ต่อไปนี้มาจากรหัสจริงที่ฉันเขียน (ใน Python 2.5) นี่เป็นวิธีที่ง่ายที่สุดที่ฉันค้นพบในการทำสิ่งที่คุณขอ
import ctypes
# Load DLL into memory.
hllDll = ctypes.WinDLL ("c:\\PComm\\ehlapi32.dll")
# Set up prototype and parameters for the desired function call.
# HLLAPI
hllApiProto = ctypes.WINFUNCTYPE (
ctypes.c_int, # Return type.
ctypes.c_void_p, # Parameters 1 ...
ctypes.c_void_p,
ctypes.c_void_p,
ctypes.c_void_p) # ... thru 4.
hllApiParams = (1, "p1", 0), (1, "p2", 0), (1, "p3",0), (1, "p4",0),
# Actually map the call ("HLLAPI(...)") to a Python name.
hllApi = hllApiProto (("HLLAPI", hllDll), hllApiParams)
# This is how you can actually call the DLL function.
# Set up the variables and call the Python name with them.
p1 = ctypes.c_int (1)
p2 = ctypes.c_char_p (sessionVar)
p3 = ctypes.c_int (1)
p4 = ctypes.c_int (0)
hllApi (ctypes.byref (p1), p2, ctypes.byref (p3), ctypes.byref (p4))
ctypes
สิ่งมีทุกประเภทประเภท C ข้อมูล ( int
, char
, short
, void*
, และอื่น ๆ ) และสามารถส่งผ่านโดยค่าหรือการอ้างอิง นอกจากนี้ยังสามารถคืนค่าชนิดข้อมูลเฉพาะได้แม้ว่าตัวอย่างของฉันจะไม่ทำเช่นนั้น (HLL API คืนค่าโดยการแก้ไขตัวแปรที่ส่งผ่านโดยการอ้างอิง)
ในแง่ของตัวอย่างเฉพาะที่แสดงด้านบน EHLLAPI ของ IBM เป็นอินเตอร์เฟสที่สอดคล้องกัน
ทุกสายผ่านสี่โมฆะชี้ (EHLLAPI ส่งกลับส่งกลับรหัสผ่านพารามิเตอร์ที่สี่ตัวชี้ไปยังint
ดังนั้นในขณะที่ผมระบุint
เป็นประเภทผลตอบแทนที่ฉันสามารถละเว้นได้) ตามเอกสารของไอบีเอ็มที่นี่ กล่าวอีกนัยหนึ่งตัวแปร C ของฟังก์ชันจะเป็น:
int hllApi (void *p1, void *p2, void *p3, void *p4)
สิ่งนี้ทำให้ctypes
ฟังก์ชั่นที่เรียบง่ายและเรียบง่ายสามารถทำสิ่งใดก็ได้ที่ EHLLAPI ไลบรารีมอบให้ แต่ก็เป็นไปได้ว่าห้องสมุดอื่น ๆ จะต้องมีctypes
การตั้งค่าฟังก์ชั่นแยกต่างหากต่อฟังก์ชั่นของห้องสมุด
ค่าส่งคืนจากWINFUNCTYPE
เป็นฟังก์ชันต้นแบบ แต่คุณยังต้องตั้งค่าข้อมูลพารามิเตอร์เพิ่มเติม (สูงกว่าประเภท) tuple แต่ละอันhllApiParams
มีพารามิเตอร์ "direction" (1 = input, 2 = output และอื่น ๆ ) ชื่อพารามิเตอร์และค่าเริ่มต้น - ดูctypes
doco เพื่อดูรายละเอียด
เมื่อคุณมีข้อมูลต้นแบบและพารามิเตอร์คุณสามารถสร้าง Python "callable" hllApi
เพื่อใช้เรียกฟังก์ชัน คุณเพียงแค่สร้างตัวแปรที่ต้องการ ( p1
ผ่านp4
ในกรณีของฉัน) และเรียกใช้ฟังก์ชันกับพวกเขา
hllApiParams
ทำอย่างไร อะไรคือสิ่งอันดับ tuples? มันยากที่จะจับคู่บางสิ่งในตัวอย่างนี้กับเอกสาร
หน้านี้มีตัวอย่างง่ายๆของการเรียกฟังก์ชั่นจากไฟล์ DLL
การถอดความรายละเอียดที่นี่เพื่อความสมบูรณ์:
มันง่ายมากที่จะเรียกใช้ฟังก์ชัน DLL ใน Python ฉันมีไฟล์ DLL ที่สร้างตัวเองพร้อมกับฟังก์ชั่นสองอย่าง
add
และsub
ข้อโต้แย้งสองข้อ
add(a, b)
ส่งคืนการเพิ่มตัวเลขสองตัว
sub(a, b)
คืนการแทนที่ตัวเลขสองจำนวนชื่อของไฟล์ DLL จะเป็น "demo.dll"
โปรแกรม:
from ctypes import*
# give location of dll
mydll = cdll.LoadLibrary("C:\\demo.dll")
result1= mydll.add(10,1)
result2= mydll.sub(10,1)
print "Addition value:"+result1
print "Substraction:"+result2
เอาท์พุท:
Addition value:11
Substraction:9
ctypes สามารถใช้เพื่อเข้าถึง dll ที่นี่คือแบบฝึกหัด:
อาจจะด้วยDispatch
:
from win32com.client import Dispatch
zk = Dispatch("zkemkeeper.ZKEM")
โดยที่ zkemkeeper เป็นไฟล์ DLL ที่ลงทะเบียนไว้ในระบบ ... หลังจากนั้นคุณสามารถเข้าถึงฟังก์ชั่นต่างๆ
zk.Connect_Net(IP_address, port)
ผมนำเสนอเป็นตัวอย่างที่ทำงานอย่างเต็มที่เกี่ยวกับวิธีการสร้างshared library
และใช้ภายใต้การโดยวิธีการของPython
ctypes
ฉันพิจารณาคดีและข้อตกลงกับWindows
DLLs
ต้องการสองขั้นตอน:
shared library
ผมพิจารณาคือต่อไปนี้และมีอยู่ในtestDLL.cpp
ไฟล์ ฟังก์ชั่นเดียวที่testDLL
เพิ่งได้รับint
และพิมพ์
#include <stdio.h>
extern "C" {
__declspec(dllexport)
void testDLL(const int i) {
printf("%d\n", i);
}
} // extern "C"
เพื่อสร้างDLL
ด้วยVisual Studio
จากบรรทัดคำสั่งทำงาน
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\vsdevcmd"
เพื่อตั้งค่าเส้นทางรวมแล้วเรียกใช้
cl.exe /D_USRDLL /D_WINDLL testDLL.cpp /MT /link /DLL /OUT:testDLL.dll
เพื่อสร้าง DLL
DLL
จาก IDEหรือมิฉะนั้นDLL
สามารถสร้างได้โดยใช้Visual Studio
ดังนี้:
ภายใต้ Python ให้ทำดังต่อไปนี้
import os
import sys
from ctypes import *
lib = cdll.LoadLibrary('testDLL.dll')
lib.testDLL(3)
ctypes จะเป็นสิ่งที่ง่ายที่สุดในการใช้งาน แต่การใช้ผิดพลาดทำให้ Python ถูกกระแทก หากคุณกำลังพยายามทำบางสิ่งอย่างรวดเร็วและคุณก็ระวังตัวมันยอดเยี่ยม
ฉันอยากจะแนะนำให้คุณตรวจสอบBoost หลาม ใช่มันต้องการให้คุณเขียน c ++ โค้ดบางส่วนและมีการแปลภาษา C ++ แต่คุณไม่จำเป็นต้องจริงที่จะเรียนรู้ภาษา C ++ ที่จะใช้มันและคุณจะได้รับฟรี (ในเบียร์) C ++ คอมไพเลอร์จากไมโครซอฟท์
ถ้า DLL เป็นชนิดไลบรารี COM คุณสามารถใช้ pythonnet
pip install pythonnet
จากนั้นในรหัสไพ ธ อนของคุณลองต่อไปนี้
import clr
clr.AddReference('path_to_your_dll')
จากนั้นยกตัวอย่างวัตถุตามระดับใน DLL และเข้าถึงวิธีการภายใน