मैं पायथन से DLL फ़ाइल का उपयोग कैसे कर सकता हूं?


186

किसी DLLफ़ाइल को भीतर से उपयोग करने का सबसे आसान तरीका क्या है Python?

विशेष रूप से, कार्यक्षमता को उजागर करने के लिए किसी भी अतिरिक्त आवरण कोड को लिखे बिना ऐसा कैसे किया जा सकता है ?C++Python

Pythonतृतीय-पक्ष लायब्रेरी का उपयोग करके मूल कार्यक्षमता को अधिक पसंद किया जाता है।


@Remuze क्या आपने गलत प्रश्न को टैग किया या गलत उत्तर के साथ टैग किया? वे दोनों अजगर हैं, लेकिन मुझे कोई कारण नहीं दिखता है कि आप उन्हें समान रूप से देखेंगे (और मैंने यह सुनिश्चित करने के लिए संशोधन इतिहास की जांच की कि यह अतीत में किसी बिंदु पर करीब नहीं था)
फ़ून

@ हाँ हम्म्म्म हाँ क्षमा करें, मेरा मतलब था एक और प्रश्न को डुप्लिकेट के रूप में फ़्लैग करना और यह एक डाल देना :) मुझे लगता है कि पता चलता है कि वे कितने समान हैं!
ट्रेव डेविस

जवाबों:


154

उपयोग में आसानी के लिए, ctypes जाने का रास्ता है।

Ctypes का निम्नलिखित उदाहरण मेरे द्वारा लिखे गए वास्तविक कोड से है (पायथन 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वापसी प्रकार के रूप में, मैं उसे अनदेखा कर सकते) आईबीएम के प्रलेखन के अनुसार यहाँ । दूसरे शब्दों में, फंक्शन का C वेरिएंट होगा:

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

यह ctypesEHLLAPI लाइब्रेरी प्रदान करने के लिए कुछ भी करने में सक्षम एक एकल, सरल फ़ंक्शन के लिए बनाता है , लेकिन यह संभावना है कि अन्य पुस्तकालयों को ctypesप्रति लाइब्रेरी फ़ंक्शन की स्थापना के लिए एक अलग फ़ंक्शन की आवश्यकता होगी ।

से वापसी मान WINFUNCTYPEएक फ़ंक्शन प्रोटोटाइप है, लेकिन आपको अभी भी अधिक पैरामीटर जानकारी (प्रकारों के ऊपर और ऊपर) सेट करना होगा। प्रत्येक टपल में hllApiParamsएक पैरामीटर "दिशा" (1 = इनपुट, 2 = आउटपुट और इतने पर), एक पैरामीटर नाम और एक डिफ़ॉल्ट मान है - ctypesविवरण के लिए डोको देखें

एक बार जब आपके पास प्रोटोटाइप और पैरामीटर जानकारी होती है, तो आप पायथन " hllApiकॉल करने योग्य" बना सकते हैं जिसके साथ फ़ंक्शन को कॉल करना है। आप बस जरूरत चर (बनाने p1के माध्यम से p4मेरे मामले में) और उनके साथ समारोह कहते हैं।


1
नमस्कार, यह एक लंबा समय हो सकता है क्योंकि किसी ने यहां जवाब दिया था, लेकिन मैं अपने कार्यक्रम के लिए इस काम को करने के लिए कुछ जानना चाहता था। क्या आप मुझे बता सकते हैं कि इसमें "HLLAPI" क्या है? इसके अलावा, अगर मैं एक फ़ंक्शन "शून्य BoxProperties (डबल एल, डबल एच, डबल डब्ल्यू, डबल एंड ए, डबल एंड वी) के साथ अपने डीएल तक पहुंचना चाहता हूं;" क्या आप मुझे यह सुझाव दे सकते हैं कि काम करने के लिए मुझे उपरोक्त कोड में क्या बदलाव करने चाहिए? चीयर्स।
Neophile

4
वास्तव में क्या करता hllApiParamsहै? उन टुपल्स का क्या मतलब है? प्रलेखन के साथ इस उदाहरण में कुछ चीजों का मिलान करना कठिन है।
जोनाथन रेनहार्ट

1
@JonathonReinhart, मैंने नीचे कुछ पाठ के साथ विशिष्ट उदाहरण को थोड़ा सा हटा दिया है। उम्मीद है, कि यह थोड़ा बेहतर बताते हैं। यदि नहीं, तो मुझे बताएं और मैं फिर से कोशिश करूंगा :-)
paxdiablo

1
उत्कृष्ट उत्तर, 6 साल बाद बहुत मदद करता है :) अगर मैंने इसे किया होता तो मैं एक +100 लगाता!
कर्नल ब्यूवेल

1
यह एक ctypes नए चेहरे के दृष्टिकोण से सुपर भ्रामक है .. बिल्कुल निश्चित नहीं है कि क्या हो रहा है, यहां तक ​​कि स्पष्टीकरण के साथ भी।
डकपंचर

69

इस पृष्ठ में 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


2
इस उत्तर में लिंक टूट गया है।
कलिबेर 64

10
यदि लिंक आपके लिए काम नहीं करता है, तो चिंता न करें, यह एक सीधा कॉपी पेस्ट है। आप किसी भी जानकारी को याद नहीं कर रहे हैं।
दलदल


6

शायद इसके साथ Dispatch:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

जहाँ zkemkeeper सिस्टम पर एक पंजीकृत DLL फ़ाइल है ... उसके बाद, आप उन्हें कॉल करके कार्यों को एक्सेस कर सकते हैं:

zk.Connect_Net(IP_address, port)

मैं इस zkemkeeper.ZKEM पर काम कर रहा हूं, क्या आप जानते हैं कि मैं अजगर में रियलटाइम इवेंट कैसे प्राप्त कर सकता हूं?
सैम जिगलर

4

DLL का निर्माण और इसे ctypes का उपयोग करके पायथन के तहत लिंक करना

मैं एक पूरी तरह से काम करने का उदाहरण पेश करता हूं कि कैसे निर्माण करना shared libraryऔर इसके Pythonमाध्यम से इसका उपयोग करना है ctypes। मैं Windowsमामले पर विचार करता हूं और निपटता हूं DLLs। दो चरणों की आवश्यकता है:

  1. डीएलएल का निर्माण विज़ुअल स्टूडियो के कंपाइलर का उपयोग कमांड लाइन से या आईडीई से करें;
  2. Ctypes का उपयोग करके पायथन के तहत 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 का निर्माण

कमांड लाइन रन से एक के 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आईडीई से निर्माण

वैकल्पिक रूप से, निम्नानुसार DLLनिर्माण किया जा सकता Visual Studioहै:

  1. फ़ाइल -> नया -> परियोजना;
  2. स्थापित -> टेम्पलेट -> दृश्य C ++ -> विंडोज -> Win32 -> Win32Project;
  3. आगे;
  4. आवेदन का प्रकार -> डीएलएल;
  5. अतिरिक्त विकल्प -> खाली परियोजना (चयन);
  6. अतिरिक्त विकल्प -> पूर्वनिर्धारित हेडर (अचयनित);
  7. परियोजना -> गुण -> विन्यास प्रबंधक -> सक्रिय समाधान मंच: x64;
  8. प्रोजेक्ट -> गुण -> कॉन्फ़िगरेशन प्रबंधक -> सक्रिय समाधान कॉन्फ़िगरेशन: रिलीज़।

पायथन के तहत DLL को जोड़ना

पायथन के तहत, निम्नलिखित करें

import os
import sys
from ctypes import *

lib = cdll.LoadLibrary('testDLL.dll')

lib.testDLL(3)

अगर अजगर पैकेज में डीएलएल क्या होगा? मैं इसे कैसे एक्सेस करूं?
डिकैन्जेन

3

ctypes का उपयोग करना सबसे आसान काम होगा लेकिन (गलत) इसका उपयोग करके पायथन दुर्घटनाग्रस्त होने का विषय बनता है। यदि आप जल्दी से कुछ करने की कोशिश कर रहे हैं, और आप सावधान हैं, तो यह बहुत अच्छा है।

मैं आपको बूस्ट पायथन की जांच करने के लिए प्रोत्साहित करूंगा । हां, इसके लिए आवश्यक है कि आप कुछ C ++ कोड लिखें और C ++ कंपाइलर रखें, लेकिन इसका उपयोग करने के लिए आपको वास्तव में C ++ सीखने की आवश्यकता नहीं है, और आप Microsoft से मुफ्त (बीयर के रूप में) C ++ कंपाइलर प्राप्त कर सकते हैं ।


0

यदि DLL COM लाइब्रेरी का प्रकार है, तो आप pythonnet का उपयोग कर सकते हैं।

pip install pythonnet

फिर अपने अजगर कोड में, निम्नलिखित प्रयास करें

import clr
clr.AddReference('path_to_your_dll')

तब DLL में वर्ग के अनुसार किसी ऑब्जेक्ट को तुरंत टाइप करें, और उसके भीतर तरीकों तक पहुँचें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.