2012-08-23 18 views
16

Tôi có một dự án Python với nhiều mô-đun phụ mà tôi đóng gói với các dấu rãnh. Tôi muốn xây dựng một số phần mở rộng Python trong C để sống trong một số các mô-đun phụ nhưng tôi không hiểu làm thế nào để có được phần mở rộng Python để sống trong một submodule. Sau đây là ví dụ đơn giản về những gì tôi đang tìm:Làm thế nào để xây dựng một phần mở rộng Python C vì vậy tôi có thể nhập nó từ một mô-đun

Đây là phần mở rộng Python tôi 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); 
} 

Và đây là một setup.py rằng hoạt động:

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

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

Sau khi cài đặt trong một virtualenv Tôi có thể làm điều này:

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

Nhưng tôi muốn có c_extension sống trong mô-đun phụ, giả sử foo.bar. Tôi cần làm gì để thay đổi trong đường ống này để có thể có được những hành vi trong vỏ Python là như thế này:

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

Trả lời

12

Chỉ cần thay đổi

Extension('c_extension', ...) 

để

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

Bạn sẽ cần các tệp __init__.py trong mỗi thư mục foobar, như thường lệ. Để có những đóng gói với các mô-đun trong setup.py của bạn, bạn cần phải thêm

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

để thiết lập của bạn() gọi, và bạn sẽ cần cấu trúc thư mục

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

trong thư mục nguồn của bạn.

+0

Cảm ơn câu trả lời nhưng điều đó không hiệu quả đối với tôi. Tôi đã tạo thư mục 'foo/bar' với' __init __. Py' trong mỗi dấu cộng, thêm tiền tố 'foo.bar.' vào lệnh setup nhưng trong shell python thì điều này xảy ra: >>> import foo.bar.c_extension Traceback (cuộc gọi gần đây nhất): Tệp "", dòng 1, trong Nhập khẩu lỗi: Không có mô-đun nào có tên c_extension – Rich

+0

Và vừa xem bản chỉnh sửa của bạn, tôi cũng thêm dòng gói. – Rich

+0

Bạn đang sử dụng phiên bản Python nào? Tôi đang thử nghiệm trên 2.7.3. – nneonneo