DLL
내부 에서 파일 을 사용하는 가장 쉬운 방법은 무엇입니까 Python
?
특히, 추가 래퍼 코드를 작성하지 않고 어떻게 C++
기능을 수행 할 수 Python
있습니까?
Python
타사 라이브러리를 사용하는 것보다 기본 기능이 선호됩니다.
DLL
내부 에서 파일 을 사용하는 가장 쉬운 방법은 무엇입니까 Python
?
특히, 추가 래퍼 코드를 작성하지 않고 어떻게 C++
기능을 수행 할 수 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는 참조로 전달 된 변수를 수정하여 값을 반환합니다).
위에 표시된 특정 예와 관련하여 IBM의 EHLLAPI는 상당히 일관된 인터페이스입니다.
모든 통화는 (EHLLAPI는에 네 번째 매개 변수를 통해 반환 코드를 다시 포인터 보내는 네 무효 포인터를 전달 int
내가 지정하는 동안, 그래서를 int
IBM의 설명서에 따라 반환 유형으로, 내가 안전하게 무시할 수) 여기 . 다시 말해 함수의 C 변형은 다음과 같습니다.
int hllApi (void *p1, void *p2, void *p3, void *p4)
이것은 하나의 간단한 ctypes
함수가 EHLLAPI 라이브러리가 제공하는 모든 것을 수행 할 수있게하지만, 다른 라이브러리는 ctypes
라이브러리 함수마다 별도의 함수 설정 이 필요할 것 입니다.
의 반환 값 WINFUNCTYPE
은 함수 프로토 타입이지만 더 많은 매개 변수 정보를 설정해야합니다 (유형 이상). 각 튜플 hllApiParams
에는 매개 변수 "방향"(1 = 입력, 2 = 출력 등), 매개 변수 이름 및 기본값 ctypes
이 있습니다. 자세한 내용은 doco를 참조하십시오.
프로토 타입 및 매개 변수 정보가 있으면 hllApi
함수를 호출 할 Python "호출 가능" 을 작성할 수 있습니다 . 당신은 단순히 (필요한 변수 생성 p1
을 통해 p4
내 경우)을하고 그들과 함께 함수를 호출합니다.
hllApiParams
합니까? 그 튜플의 요점은 무엇입니까? 이 예제의 일부 내용과 설명서를 일치시키기는 어렵습니다.
이 페이지 에는 DLL 파일에서 함수를 호출하는 매우 간단한 예가 있습니다.
완전성을 위해 여기에 세부 사항을 해석하십시오.
파이썬에서 DLL 함수를 호출하는 것은 매우 쉽습니다. 나는 두 가지 기능을 가진 자체 제작 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
with 를 빌드하려면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
.
파이썬에서 다음을 수행하십시오.
import os
import sys
from ctypes import *
lib = cdll.LoadLibrary('testDLL.dll')
lib.testDLL(3)
ctypes는 사용하기 가장 쉬운 방법이지만 사용하면 파이썬이 충돌하게됩니다. 무언가를 빨리하려고하는데주의를 기울이면 좋습니다.
Boost Python 을 확인하는 것이 좋습니다 . 예, C ++ 코드를 작성하고 C ++ 컴파일러가 필요하지만 실제로 C ++을 배우기 위해 사용할 필요는 없으며 Microsoft 에서 무료로 (맥주에서와 같이) C ++ 컴파일러를 얻을 수 있습니다 .
DLL이 COM 라이브러리 유형 인 경우 pythonnet을 사용할 수 있습니다.
pip install pythonnet
그런 다음 파이썬 코드에서 다음을 시도하십시오
import clr
clr.AddReference('path_to_your_dll')
그런 다음 DLL의 클래스에 따라 객체를 인스턴스화하고 그 안의 메소드에 액세스하십시오.