Tôi đã tìm thấy câu trả lời một phần giữa các tài liệu, danh sách gửi thư, và this question here, nhưng tôi muốn để có được một câu trả lời trực tiếp hơn việc giải quyết chi tiết cụ thể của tôi ...cấu trúc dự án cho gói nhiều C++ lớp trong cython đến một đối tượng chia sẻ duy nhất
Tôi đang học cython bằng cách cố gắng để bọc các phần nhỏ, từng chút một, của một thư viện mà tôi đã sử dụng mà hiện đang được bọc trong tăng :: python. Tôi đã đóng góp một chút nhỏ cho wrapper tăng này, và đang sử dụng nó như là một tài liệu tham khảo C++, trong khi cùng lúc tôi đang sử dụng ZeroMQ Python bindings như một tham chiếu cython.
Câu hỏi của tôi là về cấu trúc dự án. Phiên bản tăng cường hiện tại của lib này biên dịch thành một đơn .so
và đó là mục tiêu của tôi. Tôi nhanh chóng phát hiện ra rằng bạn không thể trực tiếp biên dịch nhiều mô-đun .pyx
thành một đơn .so
. Sau đó tôi bắt đầu đi xuống con đường xác định các tệp cppclass
trong các tệp pxd
và các tệp triển khai trùn tương ứng của chúng trong .pxi
và cố gắng đưa chúng vào một đơn pyx
để biên dịch. Trong khi nó làm việc lúc đầu, một khi tôi đã viết nhiều hơn một chút tôi nhấn vấn đề với nhiều định nghĩa xung đột vì pxi
bao gồm ở những nơi khác nhau.
Tôi rất thích nghe một cách tiếp cận tổ chức phù hợp nhằm giải quyết các câu hỏi sau và mục tiêu:
- Đặt tên lớp công chúng giống như
cppclass
(Tôi đang làm điều này bây giờ bằng cách có cppclass trong một khác nhau tênpyd
và sử dụng không gian tên nhập khẩu để xử lý những cái tên tương tự, ala Using cimport to resolve naming conflicts) - Độc
.so
như sản lượng biên dịch (acceptable approach?) - tôi sử dụng
pyx
đa bao gồm cách tiếp cận vào chínhpyx
cho rằng một mình, hoặc nênpyx
chính có chứa bất cứ điều gì khác ngoài chỉ giữ các bao gồm? - Nơi xác định trung tâm các hằng số sẽ được xuất trong python?
- Có cấu trúc thư mục ưa thích nào không? Ngay bây giờ tôi có mọi thứ trong một thư mục
src
lớn bên dướisetup.py
của tôi. Thật khó hiểu khi thấy rất nhiều tập tinpxi, pxd, pyx
. - Hiện tại
pxi
có hoàn toàn không cần thiết không? Nếu không, tôi có cần phải sử dụng một bảo vệ ifndef kiểu cython để xử lý nhiều tạp giữa các mô-đun khác nhau không? - Tôi biết các ràng buộc python ZeroMQ xây dựng nhiều mô-đun và sử dụng cách tiếp cận gói bằng cách bao gồm chúng thông qua
__init__.py
. Đó có thực sự là cách tiếp cận phù hợp với cython không?
Để tham khảo, dự án tôi đang thực hành để bọc lại là PyOpenNI (openni). Mô hình mà dự án tăng này lấy là thu thập các đối tượng chung ở một nơi và sau đó xác định định nghĩa đầu trang 1 đến 1 với nguồn và sau đó có một trình bao bọc lớn thu thập tất cả các định nghĩa vào một vị trí duy nhất. Và cũng có thể xử lý ngoại lệ tùy chỉnh và tiện ích.
Bạn có thể trỏ đến phần còn lại của mã mà bạn đã đặt cùng nhau cho trình bao bọc này không? Tôi đang chạy vào một vấn đề tương tự với độ phân giải tương tự. Nó không đẹp nhưng nó hoạt động. – ibell
Xin chào. Vì vậy, đây không phải là bất cứ điều gì mà kết thúc trong một repo công cộng. Hầu hết các ví dụ mới nhất của tôi về cấu trúc này không trực tuyến nhưng đây là ví dụ mà tôi đã thực hiện ngay sau này: https: //github.com/chadmv/plow/tree/master/lib/python/src – jdi
Những gì tôi làm bây giờ là giữ các tệp pxi trong và bao gồm thư mục con để làm cho nó sạch sẽ. Và tôi chỉ có pyx đơn chính phía trên nó cùng với pxd chứa tất cả các khai báo bên ngoài để ràng buộc với C/CPP – jdi