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


186

DLL내부 에서 파일 을 사용하는 가장 쉬운 방법은 무엇입니까 Python?

특히, 추가 래퍼 코드를 작성하지 않고 어떻게 C++기능을 수행 할 수 Python있습니까?

Python타사 라이브러리를 사용하는 것보다 기본 기능이 선호됩니다.


@Remuze 당신은 틀린 질문이나 틀린 답으로 태그를 했습니까? 둘 다 파이썬이지만 비슷한 점을 찾을 이유가 전혀 없습니다 (그리고 과거의 어느 시점에서 어느 정도 더 가깝지 않은지 확인하기 위해 개정 내역을 확인했습니다)
Foon

@ foon hmmm 예 죄송합니다. 또 다른 질문을 중복으로 표시 하고이 질문을 넣으려고했습니다. :) 얼마나 비슷한 지 보여줍니다.
Trev Davies

답변:


154

사용하기 쉽도록 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내 경우)을하고 그들과 함께 함수를 호출합니다.


1
안녕하세요, 누군가가 여기에 답한 이후 오랜 시간이 걸릴 수 있지만이 프로그램을 제대로 작동시킬 수있는 방법을 알고 싶었습니다. 이것에 "HLLAPI"가 무엇인지 말씀해 주시겠습니까? 또한 "void BoxProperties (double L, double H, double W, double & A, double & V);"함수를 사용하여 dll에 액세스하려면; 위 코드를 변경하기 위해 어떤 변경을해야하는지 제안 할 수 있습니까? 건배.
Neophile

4
정확히 무엇을 hllApiParams합니까? 그 튜플의 요점은 무엇입니까? 이 예제의 일부 내용과 설명서를 일치시키기는 어렵습니다.
Jonathon Reinhart

1
@ JonathonReinhart, 나는 하단에 약간의 텍스트가있는 구체적인 예제를 만들어 냈습니다. 바라건대, 그것은 조금 더 잘 설명합니다. 그렇지 않은 경우 알려 주시면 다시 시도하겠습니다 :-)
paxdiablo

1
훌륭한 답변, 6 년 후에 많은 도움이됩니다 :) 내가 할 수 있다면 +100을 넣었을 것입니다!
Beauvel 대령

1
이것은 ctypes newcomers 관점과는 매우 혼동됩니다.
DuckPuncher

69

이 페이지 에는 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


2
이 답변의 링크가 끊어졌습니다.
Kaliber64

10
링크가 작동하지 않더라도 걱정하지 마십시오. 직접 복사하여 붙여 넣기입니다. 정보가 없습니다.
marsh


6

아마 Dispatch:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

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

zk.Connect_Net(IP_address, port)

이 zkemkeeper.ZKEM에서 일하고 있습니다. 파이썬에서 실시간 이벤트를 얻는 방법을 알고 있습니까?
Sam Ziggler

4

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)

파이썬 패키지의 DLL이 있다면? 어떻게 액세스합니까?
tennza

3

ctypes는 사용하기 가장 쉬운 방법이지만 사용하면 파이썬이 충돌하게됩니다. 무언가를 빨리하려고하는데주의를 기울이면 좋습니다.

Boost Python 을 확인하는 것이 좋습니다 . 예, C ++ 코드를 작성하고 C ++ 컴파일러가 필요하지만 실제로 C ++을 배우기 위해 사용할 필요는 없으며 Microsoft 에서 무료로 (맥주에서와 같이) C ++ 컴파일러를 얻을 수 있습니다 .


0

DLL이 COM 라이브러리 유형 인 경우 pythonnet을 사용할 수 있습니다.

pip install pythonnet

그런 다음 파이썬 코드에서 다음을 시도하십시오

import clr
clr.AddReference('path_to_your_dll')

그런 다음 DLL의 클래스에 따라 객체를 인스턴스화하고 그 안의 메소드에 액세스하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.