चिन्मय कांची का जवाब उत्कृष्ट है, लेकिन मैं एक फ़ंक्शन का एक उदाहरण चाहता था जो एक सी ++ कोड के चर / सरणियों को पारित करता है और वापस करता है। हालाँकि मैं इसे यहाँ शामिल करूँगा क्योंकि यह दूसरों के लिए उपयोगी है।
पूर्णांक को पास करना और वापस करना
एक फ़ंक्शन के लिए C ++ कोड जो पूर्णांक लेता है और एक लौटाया गया मान जोड़ता है,
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 प्रिंट करता है।
किसी सरणी को पास करना और प्रिंट करना
आप सरणी के तत्व को प्रिंट करने के लिए C कोड के लिए निम्नानुसार सरणियाँ भी पास कर सकते हैं,
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
, संरेखित के Numpy सरणी के लिए सूचक के रूप में, c_contiguous 64 बिट फ्लोट और दूसरा तर्क पूर्णांक के रूप में होता है जो C कोड को Numpy सरणी में तत्वों की संख्या बताता है। इसके बाद सी कोड द्वारा इस प्रकार मुद्रित किया गया,
1.4
2.6
3.0
>>>
importtest.py? जब लोग>>>
प्रत्येक पंक्ति पर कोड डालते हैं, तो यह दर्शाता है कि यह इंटरैक्टिव शेल में चलाया जा रहा है। किसी फ़ाइल से इसे चलाने के लिए,>>>
(जहाँ यह दिखाई देता है वहां 3> संकेत और एक स्थान) को हटा दें ।