2009-11-05 13 views
6

Làm cách nào để biên dịch một mô-đun C-Python sao cho nó là địa phương với mô-đun khác? Ví dụ. nếu tôi có một mô-đun có tên là "bar" và một mô-đun khác có tên "mymodule", làm cách nào để biên dịch "thanh" để nó được nhập thông qua "nhập mymodule.bar"?Các tiện ích mở rộng/mô-đun Python C lồng nhau?

(Xin lỗi nếu điều này vẫn chưa được phrased, tôi đã không chắc chắn những gì thuật ngữ thích hợp cho nó là gì.)

Tôi đã thử các sau đây trong setup.py, nhưng nó dường như không làm việc:

from distutils.core import setup, Extension 

setup(name='mymodule', 
     version='1.0', 
     author='Me', 
     ext_modules=[Extension('mymodule', ['mymodule-module.c']), 
        Extension('bar', ['bar-module.c'])]) 

Sửa

Cảm ơn Alex. Vì vậy, đây là những gì tôi đã sử dụng cuối cùng:

from distutils.core import setup, Extension 

PACKAGE_NAME = 'mymodule' 

setup(name=PACKAGE_NAME, 
     version='1.0', 
     author='Me', 
     packages=[PACKAGE_NAME], 
     ext_package=PACKAGE_NAME 
     ext_modules=[Extension('foo', ['mymodule-foo-module.c']), 
        Extension('bar', ['mymodule-bar-module.c'])]) 

với thư mục có tên "mymodule" chứa __init__.py.

Trả lời

3

Các hướng dẫn là here:

Extension ('foo', [ 'src/foo1.c', 'src/foo2.c'])

mô tả một phần mở rộng mà sống ở gói gốc, trong khi

Extension ('pkg.foo', [ 'src/foo1.c', 'src/foo2.c'])

mô tả các extensi cùng trong gói số pkg. Các tệp nguồn và mã đối tượng kết quả giống hệt nhau trong cả hai trường hợp; khác biệt duy nhất là trong hệ thống tệp (và do đó trong hệ thống phân cấp không gian tên của Python) thời gian gia hạn kết quả.

Hãy nhớ rằng, gói luôn là thư mục (hoặc mã zip) chứa mô-đun __init__. Để tạo mô-đun là phần thân gói, mô-đun đó sẽ được gọi là __init__ và nằm trong thư mục của gói (hoặc tệp zipfile). Tôi chưa bao giờ làm điều đó trong C; nếu nó không hoạt động trực tiếp, hãy đặt tên mô-đun, ví dụ: _init thay vào đó, và trong __init__.py làm from _init import * (một trong rất ít sử dụng hợp pháp của from ... import * ;-).

Các vấn đề liên quan