2012-10-07 25 views
7

Tôi có thiết kế kém và lớn (> 300 public functions, >200 numeric constants được xác định bằng #define trong tệp tiêu đề) mà tôi phải gói bằng Python. Tôi có dll và tệp h. Thư viện được cập nhật hàng năm, cho đến nay theo cách tương thích ngược (tức là chỉ các hàm được thêm vào, hằng số giữ các giá trị số của chúng, v.v.). Nhưng tôi không có bảo đảm vì tôi không kiểm soát thư viện.Tính bảo trì của gói python của thư viện C

Sử dụng ctypes, tôi thấy hai cách gói này bằng Python:

  1. Lập bản đồ tất cả các chức năng liên tục và để trăn, 1-1
  2. Định nghĩa lại các API trong Python và thực hiện cuộc gọi đến thư viện .

Đầu tiên có thể được thực hiện trong một (xấp xỉ) cách tự động từ các tập tin header và do đó dễ dàng hơn để duy trì và nâng cấp, thứ hai đòi hỏi rất nhiều mã python nhưng nó sẽ được dễ dàng hơn để sử dụng.

Tôi sẽ đánh giá cao một số ý kiến ​​dựa trên trải nghiệm của bạn về loại vấn đề này và một số ví dụ.

+0

Xin lỗi nhưng tốt như thế này, nó không thực sự là một câu hỏi rõ ràng. –

+3

Hãy xem SWIG. –

+0

[SIP] (http://pypi.python.org/pypi/SIP/4.14) có thể là một giải pháp thú vị. –

Trả lời

4

Gần đây tôi đã sử dụng ctypesgen để tạo một bao bì ctypes cho SDL và các thư viện bổ sung (SDL_image, SDL_ttf, SDL_mixer).

Đối với tôi, nó hoạt động khá tốt. Nó tạo ra Python 2.x, nhưng tôi đã có thể lấy mã 3.x mong muốn bằng cách sử dụng tiện ích "2to3".

Tôi nghĩ nên sử dụng các mẫu bao bì làm nền tảng cho api "pythonic" hơn, và đó là những gì tôi đã làm (trên một mức độ rất đơn giản) với mô-đun pslab của tôi.

Vì vậy, nếu bạn đang muốn làm điều gì đó tương tự, đó sẽ là một cách.

0

Việc duy trì thư viện Python với chương trình phụ trợ của ctypes không phải là cách tiếp cận không thể quản lý. Rõ ràng là khoản đầu tư ban đầu lớn hơn việc sử dụng các công cụ tự động, nhưng API bạn còn lại sẽ tốt hơn nhiều.

Nếu bạn thực hiện tuyến đường đó, hãy nhắm mục tiêu tách biệt Python API hoàn toàn khỏi thư viện C. Hỗ trợ nhiều backends ctypes với một api front end của Python không phải là quá xấu - chỉ cần truy vấn trong thời gian chạy và tự động nạp đúng mô-đun wrapper ctypes. Tôi đã làm điều đó để bọc các tập tin dll khác nhau và các tập tin .so cho các cửa sổ và Linux nhưng nó sẽ làm việc cho các phiên bản của một thư viện là tốt.

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