วิธีที่ง่ายที่สุดในการใช้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 และอื่น ๆ ) ชื่อพารามิเตอร์และค่าเริ่มต้น - ดูctypesdoco เพื่อดูรายละเอียด
เมื่อคุณมีข้อมูลต้นแบบและพารามิเตอร์คุณสามารถสร้าง 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 และเข้าถึงวิธีการภายใน