2012-08-23 17 views
16

से आयात कर सकूं। मेरे पास पाइथन प्रोजेक्ट है जिसमें कई उप-मॉड्यूल हैं जिन्हें मैं डिस्ट्यूट के साथ पैकेज करता हूं। मैं इनमें से कुछ उप-मॉड्यूल में रहने के लिए सी में कुछ पायथन एक्सटेंशन बनाना चाहता हूं लेकिन मुझे समझ में नहीं आता कि पाइथन एक्सटेंशन को सबमिशन में कैसे जीना है।पाइथन सी एक्सटेंशन कैसे बनाएं ताकि मैं इसे मॉड्यूल

यहाँ मेरी अजगर विस्तार c_extension.c है:

#include <Python.h> 

static PyObject * 
get_answer(PyObject *self, PyObject *args) 
{ 
    return Py_BuildValue("i", 42); 
} 

static PyMethodDef Methods[] = { 
    {"get_answer", get_answer, METH_VARARGS, "The meaning of life."}, 
    {NULL, NULL, 0, NULL} 
}; 

PyMODINIT_FUNC 
initc_extension(void) { 
    (void) Py_InitModule("c_extension", Methods); 
} 

यहाँ और एक setup.py कि काम करता है: क्या इस प्रकार है कि मैं क्या तलाश कर रहा हूँ के सरलतम उदाहरण है

from distutils.core import setup 
from distutils.extension import Extension 

setup(name='c_extension_demo', 
     ext_modules = [Extension('c_extension', sources = ['c_extension.c'])]) 

में स्थापित करने के बाद वर्चुअलएन्व मैं यह कर सकता हूं:

>>> import c_extension 
>>> c_extension.get_answer() 
42 

लेकिन मैं c_extension उप-मॉड्यूल में रहना चाहेंगे, foo.bar कहें। क्या मैं अजगर खोल में व्यवहार प्राप्त करने के लिए इस तरह होना करने के लिए सक्षम होने के लिए इस पाइप लाइन में बदलने की जरूरत है:

>>> import foo.bar.c_extension 
>>> foo.bar.c_extension.get_answer() 
42 

उत्तर

12

बस बदलने

Extension('c_extension', ...) 

को

Extension('foo.bar.c_extension', ...) 

आप प्रत्येक foo और bar निर्देशिकाओं में से प्रत्येक में __init__.py फ़ाइलों की आवश्यकता होगी। ये आपके setup.py में मॉड्यूल के साथ पैक करवाने के लिए, यदि आप अपने स्थापना के लिए

packages = ['foo', 'foo.bar'], 

जोड़ने की जरूरत है() कहते हैं, और आप अपने स्रोत निर्देशिका में निर्देशिका संरचना

setup.py 
foo/ 
    __init__.py 
    bar/ 
     __init__.py 

की आवश्यकता होगी।

+0

उत्तर के लिए धन्यवाद लेकिन यह मेरे लिए काम नहीं करता है। मैंने प्रत्येक प्लस में '__init __। Py' के साथ' foo/bar' निर्देशिका बनाई है, सेटअप कमांड में 'foo.bar.' उपसर्ग जोड़ा है लेकिन पायथन खोल में यह होता है: >>> आयात foo.bar.c_extension ट्रेसबैक (सबसे हालिया कॉल अंतिम): फ़ाइल "", लाइन 1, आयात त्रुटि: कोई मॉड्यूल c_extension – Rich

+0

नामित नहीं है और आपने अपना संपादन देखा है, मैंने पैकेज लाइन भी जोड़ दी है। – Rich

+0

आप पाइथन का किस संस्करण का उपयोग कर रहे हैं? मैं 2.7.3 पर परीक्षण कर रहा हूं। – nneonneo

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