পাইথন থেকে আমি কীভাবে একটি ডিএলএল ফাইল ব্যবহার করতে পারি?


186

এর DLLমধ্যে থেকে কোনও ফাইল ব্যবহার করার সহজ উপায় কী Python?

বিশেষত, কার্যকারিতাটি প্রকাশ করার জন্য কোনও অতিরিক্ত মোড়ক কোড না লিখে কীভাবে এটি করা যেতে C++পারে Python?

Pythonতৃতীয় পক্ষের লাইব্রেরি ব্যবহারের চেয়ে স্থানীয় কার্যকারিতা দৃ strongly়ভাবে পছন্দ করা হয়।


@ রেমুজে আপনি কি ভুল প্রশ্ন ট্যাগ করেছেন বা ভুল উত্তর দিয়ে ট্যাগ করেছেন? তারা উভয়ই অজগর, তবে কেন আপনি এগুলিকে একেবারে অনুরূপ দেখতে পেলেন তার কোনও কারণ আমি দেখতে পাই না (এবং আমি পুনর্বিবেচনার ইতিহাসটি পরীক্ষা করে দেখেছি এটি অতীতের কোনও পর্যায়ে এটি কোনওভাবে কাছে ছিল না)
ফুন

@ প্রথম হুম, হ্যাঁ দুঃখিত, আমি অন্য একটি প্রশ্নটিকে সদৃশ হিসাবে পতাকাঙ্কিত করে এটিকে রেখেছিলাম :) আমার ধারণা যে এগুলি দেখতে কতটা মিল!
ট্রভ ডেভিস

উত্তর:


154

ব্যবহারের সহজলভ্যতার জন্য, সিটাইপগুলি হ'ল উপায়।

সিটিপসের নিম্নলিখিত উদাহরণটি আমি লিখেছি এমন আসল কোড থেকে (পাইথন 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কাপড় (সমস্ত সি-টাইপ ধরনের তথ্য রয়েছে int, char, short, void*, ইত্যাদি) এবং মান বা রেফারেন্স দ্বারা পাস করতে পারেন। এটি নির্দিষ্ট ডেটা প্রকারগুলিও ফিরিয়ে দিতে পারে যদিও আমার উদাহরণটি এটি করে না (এইচএলএল এপিআই রেফারেন্স অনুসারে একটি ভেরিয়েবল সংশোধন করে মানগুলি প্রদান করে)।


উপরে উল্লিখিত সুনির্দিষ্ট উদাহরণের নিরিখে আইবিএম এর EHLLAPI মোটামুটি ধারাবাহিক ইন্টারফেস।

সমস্ত কলগুলি চারটি অকার্যকর পয়েন্টার পাস করে (EHLLAPI চতুর্থ প্যারামিটারের মাধ্যমে ফেরত কোডটি প্রেরণ করে, এটিতে একটি পয়েন্টার , আমি রিটার্নের ধরণ হিসাবে intউল্লেখ intকরলে, আমি নিরাপদে এটিকে অগ্রাহ্য করতে পারি) এখানে আইবিএম এর ডকুমেন্টেশন অনুসারে । অন্য কথায়, ফাংশনের সি বৈকল্পিকটি হ'ল:

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

এটি ctypesEHLLAPI লাইব্রেরি সরবরাহ করে এমন কিছু করতে সক্ষম একটি সাধারণ, সাধারণ ক্রিয়াকলাপের জন্য তোলে , তবে সম্ভবত অন্যান্য গ্রন্থাগারগুলিতে ctypesলাইব্রেরি ফাংশন অনুযায়ী পৃথক ফাংশন সেট আপ করা প্রয়োজন ।

এর থেকে প্রাপ্ত ফেরত মানটি WINFUNCTYPEএকটি ফাংশন প্রোটোটাইপ তবে আপনাকে আরও প্যারামিটার তথ্য সেট আপ করতে হবে (ধরণের উপরের এবং উপরে)। প্রতিটি টিপলটির hllApiParamsএকটি প্যারামিটার "দিকনির্দেশ" (1 = ইনপুট, 2 = আউটপুট এবং এরকম), একটি প্যারামিটারের নাম এবং একটি ডিফল্ট মান রয়েছে - ctypesবিশদ জন্য ডকো দেখুন

আপনার কাছে প্রোটোটাইপ এবং পরামিতি সম্পর্কিত তথ্য পরে, আপনি একটি পাইথনকে "কলযোগ্য" তৈরি করতে পারেন hllApiযার সাহায্যে ফাংশনটি কল করতে পারেন। আপনি কেবল প্রয়োজন পরিবর্তনশীল (তৈরি p1মাধ্যমে p4আমার ক্ষেত্রে) এবং তাদের সঙ্গে ফাংশন কল।


1
হ্যালো, এখানে দীর্ঘ সময় হতে পারে যেহেতু কেউ এখানে জবাব দিয়েছে তবে আমি আমার প্রোগ্রামটির জন্য এই কাজটি করার জন্য কিছু জানতে চেয়েছিলাম। আপনি কি আমাকে বলতে পারবেন যে এতে "এইচএলএলপি" কী? এছাড়াও, আমি যদি কোনও ডিফল্ট "বাক্সপ্রাপ্তি (ডাবল এল, ডাবল এইচ, ডাবল ডাব্লু, ডাবল এবং এ, ডাবল এবং ভি)) দিয়ে আমার ডেলিতে অ্যাক্সেস করতে চাই;" উপরের কোডটিতে এটি কার্যকর করার জন্য আমার কী পরিবর্তন করা উচিত তা আপনি আমাকে পরামর্শ দিতে পারেন? চিয়ার্স।
নিওফিল

4
ঠিক hllApiParamsকি করে? এই টিপলসটির কী লাভ? এই উদাহরণে কিছু জিনিস ডকুমেন্টেশনের সাথে মেলে নেওয়া শক্ত।
জোনাথন রাইনহার্ট

1
@ জোনাথনরাইনহার্ট, আমি নীচের অংশে কিছু পাঠ্য সহ সুনির্দিষ্ট উদাহরণটি বের করেছি। আশা করি, এটি এটি আরও ভাল ব্যাখ্যা করে। যদি তা না হয় তবে আমাকে জানান এবং আমি আবার চেষ্টা করব :-)
প্যাক্সিডিয়াবল

1
চমৎকার উত্তর, 6 বছর পরে অনেক সাহায্য করে :) আমি যদি এটি করতে পারতাম তবে আমি একটি +100 রাখতাম!
কর্নেল বউভেল

1
এটি একটি সিটিপস নিউকামারদের দৃষ্টিকোণ থেকে দুর্দান্ত বিভ্রান্তিকর .. এমনকি কী চলছে তা ঠিক নিশ্চিত নয়, এমনকি ব্যাখ্যা দিয়েও।
ডাকপঞ্চার

69

এই পৃষ্ঠায় একটি ডিএলএল ফাইল থেকে ফাংশন কল করার খুব সাধারণ উদাহরণ রয়েছে।

সম্পূর্ণতার জন্য এখানে বিশদ বিবরণ:

পাইথনে একটি ডিএলএল ফাংশন কল করা খুব সহজ। আমার কাছে দুটি ফাংশন সহ একটি স্ব-তৈরি ডিএলএল ফাইল রয়েছে: addএবং subযা দুটি যুক্তি নিয়েছে।

add(a, b)দুটি সংখ্যার যোগফল দুটি সংখ্যার
sub(a, b)বিয়োগ করে দেয় returns

ডিএলএল ফাইলটির নাম হবে "ডেমো.ডিল"

কার্যক্রম:

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
যদি লিঙ্কটি আপনার পক্ষে কাজ করে না তবে চিন্তা করবেন না, এটি সরাসরি কপির পেস্ট। আপনি কোনও তথ্য অনুপস্থিত।
মার্শ


6

এর সাথে হতে পারে Dispatch:

from win32com.client import Dispatch

zk = Dispatch("zkemkeeper.ZKEM") 

যেখানে জেকেমকিপার হ'ল সিস্টেমে একটি নিবন্ধিত ডিএলএল ফাইল ... তার পরে, আপনি কেবল তাদের কল করে ফাংশনগুলি অ্যাক্সেস করতে পারেন:

zk.Connect_Net(IP_address, port)

আমি এই জেকেমকিপার.জেডকেমে কাজ করছি, আপনি কি জানেন কীভাবে আমি পাইথনে রিয়েলটাইম ইভেন্টগুলি পেতে পারি?
স্যাম জিগলার

4

একটি ডিএলএল তৈরি এবং সিটিপস ব্যবহার করে পাইথনের অধীনে এটি সংযুক্ত করা

আমি কিভাবে নির্মাণের একটি সম্পূর্ণরূপে কাজ দৃষ্টান্ত পেশ shared libraryএবং অধীনে এটি ব্যবহার Pythonমাধ্যমে ctypes। আমি কেসটি বিবেচনা করি Windowsএবং এর সাথে ডিল করি DLLs। দুটি পদক্ষেপ প্রয়োজন:

  1. কমান্ড লাইন বা আইডিই থেকে ভিজ্যুয়াল স্টুডিওর সংকলক ব্যবহার করে ডিএলএল তৈরি করুন;
  2. সিটিপস ব্যবহার করে পাইথনের অধীনে ডিএলএল লিঙ্ক করুন।

ভাগ করা লাইব্রেরি

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ব্যবহার করে তৈরি করা যেতে পারে Visual Studio:

  1. ফাইল -> নতুন -> প্রকল্প;
  2. ইনস্টল করা -> টেমপ্লেটস -> ভিজ্যুয়াল সি ++ -> উইন্ডোজ -> উইন 32 -> উইন 32 প্রকল্প;
  3. পরবর্তী;
  4. আবেদনের ধরণ -> ডিএলএল;
  5. অতিরিক্ত বিকল্প -> খালি প্রকল্প (নির্বাচন করুন);
  6. অতিরিক্ত বিকল্পগুলি -> পূর্বনির্ধারিত শিরোলেখ (আনসलेक्ट);
  7. প্রকল্প -> সম্পত্তি -> কনফিগারেশন পরিচালক -> সক্রিয় সমাধান প্ল্যাটফর্ম: x64;
  8. প্রকল্প -> সম্পত্তি -> কনফিগারেশন পরিচালক -> সক্রিয় সমাধান কনফিগারেশন: মুক্তি।

পাইথনের অধীনে ডিএলএল লিঙ্ক করা

পাইথনের অধীনে, নিম্নলিখিতগুলি করুন

import os
import sys
from ctypes import *

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

lib.testDLL(3)

পাইথন প্যাকেজে যদি ডিএলএল হয়? আমি কীভাবে এটি অ্যাক্সেস করব?
ডেকেডেনজা

3

সিটাইপস ব্যবহার করা সবচেয়ে সহজ জিনিস তবে (মিস) এটি ব্যবহার করা পাইথনকে ক্র্যাশ করার বিষয় করে তোলে। আপনি যদি কিছু দ্রুত করার চেষ্টা করছেন, এবং আপনি সাবধান হন তবে দুর্দান্ত।

আমি আপনাকে পাইস্টন বুস্ট করার জন্য উত্সাহিত করব । হ্যাঁ, এর জন্য আপনাকে কিছু সি ++ কোড লিখতে হবে এবং একটি সি ++ সংকলক থাকতে হবে তবে এটি ব্যবহার করার জন্য আপনাকে আসলে সি ++ শেখার দরকার নেই এবং আপনি মাইক্রোসফ্ট থেকে একটি বিনামূল্যে (বিয়ারের মতো) সি ++ সংকলক পেতে পারেন ।


0

যদি ডিএলএল টাইপ সিওএম লাইব্রেরি হয় তবে আপনি পাইথননেট ব্যবহার করতে পারেন।

pip install pythonnet

তারপরে আপনার অজগর কোডে নীচের চেষ্টা করুন

import clr
clr.AddReference('path_to_your_dll')

তারপরে ডিএলএল-তে শ্রেণি অনুযায়ী কোনও বস্তু ইনস্ট্যান্ট করুন এবং এর মধ্যে থাকা পদ্ধতিগুলি অ্যাক্সেস করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.