2010-11-23 13 views
7

मैं अपने पायथन प्रोग्राम में सी कोड लपेटने के लिए weave.inline को समझने की कोशिश कर रहा हूं। नीचे दिए गए कोड बस Numpy सरणी और multiplicates उसके तत्वों के सभी द्वारा 2.मैं बाहरी सी पुस्तकालयों के साथ scipy.weave.inline का उपयोग कैसे करूं?

inl.py

import numpy 
import scipy.weave 

a = numpy.array([1.0, 2.0, 3.0]) 
N = a.shape[0] 

print a 
code = \ 
    """ 
    int i; 
    for(i = 0; i < N; i++) 
    { 
    a[i] = a[i] * 2; 
    } 
    """ 

scipy.weave.inline(code, ['a','N']) 
print a 

तब मैं बाहरी पुस्तकालयों के लिए इनलाइन कोड से कुछ कार्यों ले जाने के लिए चाहते हैं लेता है। यह 2. द्वारा तुच्छ गुणा हो तो मैं दो फ़ाइलों को बनाने:

mult.c

#include "mult.h" 

float mult(float n) 
{ 
    return n * 2; 
} 

mult.h

float inc(float n); 

अब मैं समारोह mult उपयोग करना चाहते हैं मेरे इनलाइन कोड में। लेकिन मुझे नहीं पता कि मैं अपनी सी फाइलों को पाइथन इनलाइन कोड से कैसे जोड़ूं। मैंने सी फाइलों को साझा लाइब्रेरी के रूप में संकलित करने की कोशिश की और उन्हें बुनाई में शीर्षलेख और पुस्तकालयों के रूप में पास किया, लेकिन यह व्यर्थ था। कोई सुझाव?

उत्तर

7

मैं सफलतापूर्वक यह किया है का आनंद लें, आर से गणित कार्यों बुला weave.inline के माध्यम से() कोड (उबंटू लिनक्स के तहत)।

सबसे पहले, अपने सी कार्यों को साझा लाइब्रेरी के रूप में संकलित करें। मेरे मामले में, मैं क्रैन से आर के एक हाल ही में रिलीज पकड़ा, और

./configure --enable-R-static-lib --enable-static --with-readline=no 
cd src/nmath/standalone/ 
make 

अब आप एक फ़ाइल libRmath.so बुलाया होना चाहिए था। यदि libpath निर्देशिका कि libRmath.so धारण के साथ एक स्ट्रिंग है, आप की तरह

code = 'return_val = pbinom(100, 20000, 100./20000., 0, 1);' 
support_code = 'extern "C" double pbinom(double x, double n, double p, int lower_tail, int log_p);' 
weave.inline(code, support_code=support_code, 
    library_dirs=[libpath], libraries=["Rmath"], runtime_library_dirs=[libpath]) 

नोट दिए कुछ कुछ कर सकते हैं। हेडर घोषणाओं को support_code में जाना है, code (मुझे नहीं पता क्यों), और उन्हें extern "C" के साथ प्रीफ़िक्स किया जाना चाहिए क्योंकि वे सी कोड हैं, सी ++ नहीं (यह मानक है)। support_code (weave.inline के लिए दस्तावेज़ों की जांच करें) के बजाय हेडर फ़ाइलों को शामिल करना संभव होना चाहिए, लेकिन मैंने कोशिश नहीं की है। लाइब्रेरी का नाम Rmath है, लेकिन सामान्य यूनिक्स सम्मेलन में साझा लाइब्रेरी फ़ाइल libRmath.so है। और लाइब्रेरी का पथ दो बार निर्दिष्ट किया जाता है, एक बार जोड़ने के लिए, और एक बार निष्पादन के लिए।

आशा है कि इससे मदद मिलती है!

1

क्षमा करें, मुझे नहीं पता कि weave के साथ ऐसा कैसे करें। हालांकि SO simple-wrapping-of-c-code-with-cython देखें।

+0

मैंने साइथॉन, सीटीपीएस और एसडब्ल्यूआईजी जैसे सी/पायथन बाइंडिंग की कोशिश की है।बुनाई सी को अम्पी सरणी पास करने का सबसे आसान तरीका दिखता है, इसलिए मैं अपने कोड में बाहरी पुस्तकालयों का उपयोग करने का एक तरीका ढूंढना चाहता हूं। इसके अलावा, मेरे पास पहले से ही बुनाई में सी कोड का एक टुकड़ा है - और यह अच्छी तरह से काम करता है। आपका धन्यावाद। – user517893

1

extra_code नामक एक स्ट्रिंग वस्तु में mult.c और mult.h के स्रोत शब्दों में कहें, तो अपने .weave मंगलाचरण में निम्नलिखित पंक्ति जोड़

support_code=extra_code, 

वहाँ भी इस प्रकार मानक पुस्तकालयों शामिल करने का विकल्प है :

headers = ["<math.h>"] 

संबंधित मुद्दे