সিটিপস - শিক্ষানবিস


103

আমার কাছে অ্যাক্ট লাইব্রেরিটি "র‌্যাপিং" অজগর শ্রেণিতে পড়ার কাজ রয়েছে। এই বিষয়ে দস্তাবেজগুলি অবিশ্বাস্যরূপে অস্পষ্ট। দেখে মনে হচ্ছে যে তারা কেবল উন্নত পাইথন ব্যবহারকারীরা টাইপগুলি প্রয়োগ করবে। আচ্ছা, আমি পাইথনের প্রাথমিক শিক্ষিকা এবং সাহায্যের দরকার need

কিছু ধাপে ধাপে সহায়তা দারুণ হবে।

সুতরাং আমি আমার সি লাইব্রেরি আছে। আমি কি করব? আমি কোথায় কোন ফাইল রাখব? আমি কীভাবে পাঠাগারটি আমদানি করব? আমি পড়েছি পাইথনে "অটো মোড়ানোর" উপায় থাকতে পারে?

(যাইহোক, আমি পাইথন ডটকমের সিটিপস টিউটোরিয়ালটি করেছি এবং এটি কার্যকর হয় না I'm অর্থ আমি ভাবছি তারা ধরে নিচ্ছে যে আমার বাকি পদক্ষেপগুলি পূরণ করতে সক্ষম হবেন)।

আসলে তাদের ত্রুটিটি আমি তাদের কোডের সাথে পেয়েছি:

File "importtest.py", line 1
   >>> from ctypes import *
   SyntaxError: invalid syntax

আমি এটিতে কিছু ধাপে ধাপে সাহায্য ব্যবহার করতে পারি! ধন্যবাদ ~


10
আপনার কি >>> ইম্পোর্টেস্ট.পি আছে? লোকেরা যখন >>> প্রতিটি লাইনে থাকা কোডটি পোস্ট করে, এটি ইঙ্গিত করে যে এটি ইন্টারেক্টিভ শেলটিতে চলছে। এটিকে কোনও ফাইল থেকে চালানোর জন্য, >>> যেখানেই প্রদর্শিত হবে সেখানে সরান (এটি 3> চিহ্ন এবং একটি স্থান)।
চিন্ময় কাঞ্চি

4
>>>এস টাইপ করবেন না । এগুলি ইন্টারেক্টিভ শেল দ্বারা মুদ্রিত হয় এবং আপনার উত্স ফাইল থেকে বাদ দেওয়া উচিত।
nmichaels

8
>>>.PY ফাইলে! ওহ! এর আগে কখনও দেখিনি!
ডেভিড হেফারনান

4
সত্যিকার অর্থে, আপনি সিটিপস নিয়ে গণ্ডগোল শুরু করার আগে পাইথনের কিছুটা (কমপক্ষে কিছুটা) শিখুন। আপনি কখনও সিটিপসের উপর এমন টিউটোরিয়াল খুঁজে পাচ্ছেন না যা ধরে নিয়েছে যে আপনি বেসিক পাইথনটি জানেন না।
চিন্ময় কাঞ্চি

4
@ স্পেনটাক: আপনি যদি সাহায্যের জন্য জিজ্ঞাসা করেন তবে পর্যাপ্ত তথ্য সরবরাহ করুন। কমপক্ষে আপনি যে কোডটির কথা বলছেন তার শেষ সংস্করণটি আমাদের দেখান। উদাহরণস্বরূপ, "লাইন 3" এ কী রয়েছে?
ফ্রান্সেস্কো

উত্তর:


231

এখানে একটি দ্রুত এবং নোংরা সিটিপস টিউটোরিয়াল।

প্রথমে আপনার সি লাইব্রেরি লিখুন। এখানে হ্যালো ওয়ার্ল্ডের একটি সহজ উদাহরণ রয়েছে:

testlib.c

#include <stdio.h>

void myprint(void);

void myprint()
{
    printf("hello world\n");
}

এখন এটিকে একটি ভাগ করা লাইব্রেরি হিসাবে সংকলন করুন ( এখানে ম্যাক ফিক্স পাওয়া গেছে ):

$ gcc -shared -Wl,-soname,testlib -o testlib.so -fPIC testlib.c

# or... for Mac OS X 
$ gcc -shared -Wl,-install_name,testlib.so -o testlib.so -fPIC testlib.c

তারপরে, সিটিপস ব্যবহার করে একটি মোড়ক লিখুন:

testlibwrapper.py

import ctypes

testlib = ctypes.CDLL('/full/path/to/testlib.so')
testlib.myprint()

এখন এটি কার্যকর করুন:

$ python testlibwrapper.py

এবং আপনি আউটপুট দেখতে হবে

Hello world
$

আপনার যদি ইতিমধ্যে মনে একটি লাইব্রেরি থাকে তবে আপনি টিউটোরিয়ালের অ-পাইথন অংশটি এড়িয়ে যেতে পারেন। নিশ্চিত করুন যে সিটিপস লাইব্রেরিটি /usr/libঅন্য কোনও মান ডিরেক্টরিতে রেখে এটি খুঁজে পেতে পারে । আপনি যদি এটি করেন তবে মোড়ক লেখার সময় আপনাকে পুরো পাথটি নির্দিষ্ট করার দরকার নেই। আপনি যদি এটি না করা বেছে নেন তবে আপনি অবশ্যই লাইব্রেরির পুরো পথ সরবরাহ হবেctypes.CDLL()

এটি আরও বিস্তৃত টিউটোরিয়ালের জন্য জায়গা নয় তবে আপনি যদি এই সাইটের নির্দিষ্ট সমস্যাগুলির জন্য সহায়তা চান তবে আমি নিশ্চিত সম্প্রদায়টি আপনাকে সহায়তা করবে।

PS: আমি ধরে নিচ্ছি আপনি লিনাক্সে রয়েছেন কারণ আপনি ব্যবহার করেছেন ctypes.CDLL('libc.so.6')। আপনি যদি অন্য কোনও ওএসে থাকেন তবে জিনিসগুলি কিছুটা পরিবর্তিত হতে পারে (বা বেশ কিছু)।


4
@ চিন্ময়: উইন্ডোজ এবং সি এর পরিবর্তে আমার কাছে কি একই জাতীয় কোড থাকতে পারে, আপনি দয়া করে একটি ভিজ্যুয়াল সি ++ উদাহরণ সরবরাহ করতে পারেন? আমি আমার লাইব্রেরি লোড করতে সক্ষম কিন্তু আমি .dll ফাইল থেকে আমার ফাংশন অ্যাক্সেস করতে সক্ষম নই। এটি সর্বদা "ফাংশন 'xyz' পাওয়া যায় না" বলে। আপনি কি আমাকে এটার চারপাশে কোনও উপায়ের পরামর্শ দিতে পারেন? চিয়ার্স
নিওফিল

আমি উইন্ডোজ বিকাশ সম্পর্কে খুব বেশি জানি না, তবে দেখে মনে হচ্ছে উইন্ডোজ উইন্ডিজ কিছু করে, সম্ভবত এটি একটি ভিন্ন কলিং কনভেনশন ব্যবহার করে? সম্ভবত আপনি "বহিরাগত সি" ব্যবহার করে আপনার সি ++ ফাংশন রফতানি করতে পারেন?
চিন্ময় কাঞ্চি

হ্যাঁ, আমি এটি করেছিলাম তবে এখন পর্যন্ত কোনও ভাগ্য হয়নি।
নিওফিল

6
টিউটোরিয়াল অনুসরণ করা সহজ জন্য ধন্যবাদ যা টাইপ এর মৌলিক কার্যকারিতা দেখায়
Okysabeni

4
দ্রুত এবং নোংরা সর্বদা সেরা টিউটোরিয়াল হয়
লুচার

56

চিন্ময় কাঞ্চীর উত্তরটি দুর্দান্ত তবে আমি এমন একটি ফাংশনের উদাহরণ চেয়েছিলাম যা একটি সি ++ কোডে একটি ভেরিয়েবল / অ্যারে পাস করে এবং প্রদান করে। যদিও আমি এটি এখানে অন্তর্ভুক্ত করব যদি এটি অন্যের পক্ষে উপযোগী হয়।

একটি পূর্ণসংখ্যা পাস এবং ফিরে দেওয়া

একটি ক্রিয়াকলাপের জন্য সি ++ কোড যা একটি পূর্ণসংখ্যা নেয় এবং একটিকে ফেরত মান যোগ করে,

extern "C" int add_one(int i)
{
    return i+1;
}

ফাইল হিসাবে সংরক্ষণ করা হয়েছে test.cpp, প্রয়োজনীয় বাহ্যিক "সি" নোট করুন (এটি সি কোডের জন্য মুছে ফেলা যেতে পারে)। চিন্ময় কাঞ্চি উত্তরের অনুরূপ যুক্তি সহ এটি g ++ ব্যবহার করে সংকলিত হয়েছে,

g++ -shared -o testlib.so -fPIC test.cpp

পাইথন কোড ব্যবহারসমূহ load_libraryথেকে numpy.ctypeslibপাইথন স্ক্রিপ্ট হিসাবে একই ডিরেক্টরির মধ্যে অভিমানী ভাগ লাইব্রেরিতে পাথ,

import numpy.ctypeslib as ctl
import ctypes

libname = 'testlib.so'
libdir = './'
lib=ctl.load_library(libname, libdir)

py_add_one = lib.add_one
py_add_one.argtypes = [ctypes.c_int]
value = 5
results = py_add_one(value)
print(results)

এটি প্রত্যাশিত হিসাবে 6 টি প্রিন্ট করে।

একটি অ্যারে পাসিং এবং মুদ্রণ

আপনি অ্যারের উপাদান মুদ্রণের জন্য কোনও সি কোডের জন্য নিম্নলিখিতভাবে অ্যারে পাস করতে পারেন,

extern "C" void print_array(double* array, int N)
{
    for (int i=0; i<N; i++) 
        cout << i << " " << array[i] << endl;
}

যা পূর্বের মতো সংকলিত এবং একইভাবে আমদানি করা। এই ফাংশনটি ব্যবহার করার জন্য অতিরিক্ত পাইথন কোডটি তখন হবে,

import numpy as np

py_print_array = lib.print_array
py_print_array.argtypes = [ctl.ndpointer(np.float64, 
                                         flags='aligned, c_contiguous'), 
                           ctypes.c_int]
A = np.array([1.4,2.6,3.0], dtype=np.float64)
py_print_array(A, 3)

যেখানে আমরা অ্যারে নির্দিষ্ট করি, প্রথম যুক্তি print_array, প্রান্তিককরণের নম্পি অ্যারের পয়েন্টার হিসাবে, সি_কন্টিগিউজ bit৪ বিট ভাসমান এবং দ্বিতীয় যুক্তিটি পূর্ণসংখ্যা হিসাবে যা সি কোডকে নম্পি অ্যারেতে উপাদানের সংখ্যা বলে। এটি সি কোড দ্বারা নিম্নলিখিত হিসাবে মুদ্রিত,

1.4
2.6
3.0

5
এটি একটি দুর্দান্ত পরিপূরক উত্তর - লজ্জা দুটি টিক উত্তর দেওয়া যাবে না :(
jtlz2

এটি খুব সুস্পষ্ট কিনা তা নিশ্চিত নয় তবে কোডটিতে একটি ত্রুটি রয়েছে। এটি অনুপস্থিত import numpy as np। অন্যথায় এটি np.float64এবং অন্যান্য জিনিসগুলি সন্ধান করতে সক্ষম নয় ।
বেন

11

প্রথমত: >>>পাইথনের উদাহরণগুলিতে আপনি যে কোডটি দেখতে পাচ্ছেন তা ইঙ্গিত করার একটি উপায় এটি পাইথন কোড। এটি পাইথন কোডটিকে আউটপুট থেকে পৃথক করতে ব্যবহৃত হয়। এটার মত:

>>> 4+5
9

এখানে আমরা দেখতে পাই যে লাইনটি শুরু হয় >>> তা হ'ল পাইথন কোড এবং 9 এর ফলাফল এটি a

আপনি কখনই >>>অংশটি প্রবেশ করেন না.py

এটি আপনার সিনট্যাক্স ত্রুটির যত্ন নেয়।

দ্বিতীয়ত, পাইথন লাইব্রেরি মোড়ানোর একাধিক উপায়ের মধ্যে সাইকাইপস কেবল একটি। অন্যান্য উপায়গুলি হ'ল এসডাব্লুআইজি , যা আপনার পাইথন গ্রন্থাগারের দিকে নজর দেবে এবং সিপিপিটি প্রকাশ করে পাইথন সি এক্সটেনশন মডিউল তৈরি করবে। আর একটি উপায় হল সিথন ব্যবহার করা

তাদের সকলের সুবিধাগুলি এবং ঘাটতি রয়েছে।

এসডাব্লুআইজি কেবলমাত্র আপনার সি এপিআই পাইথনের কাছে প্রকাশ করবে। এর অর্থ আপনি কোনও অবজেক্ট বা কিছু পান না, আপনাকে এটি করার জন্য একটি পৃথক পাইথন ফাইল তৈরি করতে হবে। যদিও "ওয়াওজা" বলে একটি মডিউল এবং "_উওজা" নামে একটি এসডব্লিউআইজি মডিউল পাওয়া যায় যা সি এপিআইয়ের চারপাশে মোড়ক। এটি জিনিস করার একটি দুর্দান্ত এবং সহজ উপায়।

সিথন একটি সি-এক্সটেনশন ফাইল উত্পন্ন করে। এটির সুবিধাটি রয়েছে যে আপনি যে পাইথন কোডটি লিখেছেন সেগুলি সমস্ত সি তৈরি করে দেওয়া হয়েছে, সুতরাং আপনার লেখা অবজেক্টগুলিও সিটিতে রয়েছে যা একটি পারফরম্যান্স উন্নতি হতে পারে। তবে আপনাকে এটি শিখতে হবে কীভাবে এটি সি এর সাথে ইন্টারফেস করে তাই এটি কীভাবে ব্যবহার করতে হয় তা শিখতে এটি কিছুটা অতিরিক্ত কাজ।

সিটিপিসের সুবিধা রয়েছে যে সংকলনের জন্য কোনও সি-কোড নেই, সুতরাং অন্য কারও দ্বারা রচিত স্ট্যান্ডার্ড লাইব্রেরি মোড়ানোর জন্য এটি ব্যবহার করা খুব সুন্দর, এবং উইন্ডোজ এবং ওএস এক্স এর বাইনারি সংস্করণগুলিতে ইতিমধ্যে বিদ্যমান and

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