[python] 파이썬에서 DLL 파일을 어떻게 사용할 수 있습니까?

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내가 지정하는 동안, 그래서를 intIBM의 설명서에 따라 반환 유형으로, 내가 안전하게 무시할 수) 여기 . 다시 말해 함수의 C 변형은 다음과 같습니다.

int hllApi (void *p1, void *p2, void *p3, void *p4)

이것은 하나의 간단한 ctypes함수가 EHLLAPI 라이브러리가 제공하는 모든 것을 수행 할 수있게하지만, 다른 라이브러리는 ctypes라이브러리 함수마다 별도의 함수 설정 이 필요할 것 입니다.

의 반환 값 WINFUNCTYPE은 함수 프로토 타입이지만 더 많은 매개 변수 정보를 설정해야합니다 (유형 이상). 각 튜플 hllApiParams에는 매개 변수 “방향”(1 = 입력, 2 = 출력 등), 매개 변수 이름 및 기본값 ctypes이 있습니다. 자세한 내용은 doco를 참조하십시오.

프로토 타입 및 매개 변수 정보가 있으면 hllApi함수를 호출 할 Python “호출 가능” 을 작성할 수 있습니다 . 당신은 단순히 (필요한 변수 생성 p1을 통해 p4내 경우)을하고 그들과 함께 함수를 호출합니다.


답변

이 페이지 에는 DLL 파일에서 함수를 호출하는 매우 간단한 예가 있습니다.

완전성을 위해 여기에 세부 사항을 해석하십시오.

파이썬에서 DLL 함수를 호출하는 것은 매우 쉽습니다. 나는 두 가지 기능을 가진 자체 제작 DLL 파일이 있습니다 addsub두 개의 인수를 취한다.

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에 액세스 할 수 있습니다. 튜토리얼은 다음과 같습니다.

http://docs.python.org/library/ctypes.html#module-ctypes


답변

아마 Dispatch:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

zkemkeeper가 시스템에 등록 된 DLL 파일 인 경우 … 그 후에는 함수를 호출하여 액세스 할 수 있습니다.

zk.Connect_Net(IP_address, port)


답변

ctypes를 사용하여 DLL에서 DLL 작성 및 링크

나는 어떻게 구축에 완벽하게 일을 예를 제시 shared library하고 아래에 그것을 사용 Python에 의해를 ctypes. 나는 Windows사건을 고려 하고를 다룬다 DLLs. 두 단계가 필요합니다.

  1. 명령 행 또는 IDE에서 Visual Studio의 컴파일러를 사용하여 DLL을 빌드하십시오.
  2. ctypes를 사용하여 Python에서 DLL을 연결하십시오.

공유 라이브러리

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 빌드

명령 행에서 DLLwith 를 빌드하려면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을 빌드합니다.

DLLIDE에서 빌드

또는 다음과 같이 DLL사용하여 빌드 할 수 있습니다 Visual Studio.

  1. 파일-> 새로 만들기-> 프로젝트;
  2. 설치-> 템플리트-> Visual C ++-> Windows-> Win32-> Win32Project;
  3. 다음;
  4. 응용 프로그램 유형-> DLL;
  5. 추가 옵션-> 프로젝트 비우기 (선택);
  6. 추가 옵션-> 사전 컴파일 된 헤더 (선택 취소);
  7. 프로젝트-> 속성-> 구성 관리자-> 활성 솔루션 플랫폼 : x64;
  8. 프로젝트-> 특성-> 구성 관리자-> 활성 솔루션 구성 : 릴리스.

파이썬에서 DLL 연결

파이썬에서 다음을 수행하십시오.

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의 클래스에 따라 객체를 인스턴스화하고 그 안의 메소드에 액세스하십시오.