2012-04-18 37 views
18

Tôi đang khám phá trăn. Tôi tò mò về ràng buộc python. Ai có thể giải thích, làm thế nào nó có thể là bạn có thể có quyền truy cập vào các thư viện C từ Python.ràng buộc python, nó hoạt động như thế nào?

+1

Phần nào của [extemb] (http://docs.python.org/extending/index.html) không có hiểu không? –

+1

Tôi đề nghị bạn thực hiện tìm kiếm Google cho "bindings Python C". – steveha

+2

"Tôi đang khám phá trăn."Tìm hiểu về tất cả các Python là một điều tuyệt vời, nhưng bạn có lẽ nên có một sự hiểu biết rất tốt về mô hình Python trước khi nhìn quá sâu vào các ràng buộc C. Bạn sẽ hiểu cách bộ máy trợ lực hoạt động tốt hơn nhiều khi bạn biết cách lái xe –

Trả lời

25

Có một số cách để gọi mã được viết bằng C từ Python.

Đầu tiên, có mô-đun ctypes trong thư viện chuẩn. Nó cho phép bạn tải một thư viện liên kết động (DLL trên Windows, các thư viện chia sẻ .so trên Linux) và các chức năng gọi từ các thư viện này, trực tiếp từ Python. Các thư viện này thường được viết bằng C.

Thứ hai, trong trường hợp CPython có API Python/C. Nó có thể được sử dụng theo hai cách chính:

Thư viện liên kết động có thể được viết bằng C theo cách sao cho CPython coi nó như một mô-đun (bạn có thể nhập nó vào chương trình Python). Python/C API cho phép thư viện định nghĩa các hàm được viết bằng C nhưng vẫn có thể gọi được từ Python. API rất poweful và cung cấp các chức năng để thao tác tất cả các kiểu dữ liệu Python và truy cập vào nội bộ hte của trình thông dịch. Cách thứ hai để sử dụng C API là nhúng Python vào một chương trình được viết bằng C. Chương trình C sau đó có thể tạo các mô-đun tích hợp được viết bằng C và hiển thị các hàm C, giống như trong liên kết động cách tiếp cận thư viện. API cũng cho phép chương trình thực thi các tập lệnh mà sau đó có thể nhập và sử dụng các mô-đun tích hợp sẵn. Điều này có thể được sử dụng để tạo ra một hệ thống plug-in dựa trên Python.

"Bindings" được triển khai dưới dạng thư viện Python thuần túy sử dụng ctypes hoặc dưới dạng thư viện liên kết động sử dụng Python/C API. Tùy chọn thứ hai đôi khi được sử dụng với các công cụ như SWIG làm cho công việc trở nên dễ dàng hơn bằng cách chăm sóc tạo mã "nồi hơi" hoặc Boost.Python, cung cấp API C++ trên API Python/C giúp dễ dàng giao diện với mã C++ hơn.

Tiếp tục đọc: Foreign Function Interface

6

Câu trả lời là đơn giản, trình dịch python (CPython) được viết bằng C và có thể gọi các thư viện C khác một cách động, mô-đun mở rộng C hoặc mã C nhúng có thể dễ dàng gọi từ bất kỳ mã C nào khác.

CPython cho phép móc đặc biệt để nó có thể gọi mã C khác hoặc có thể được gọi từ mã C khác. Nó không cần phải là C, bất kỳ ngôn ngữ nào biên dịch mã gốc và có cùng quy ước gọi.

Ví dụ trường hợp đơn giản, bạn hãy tạo chương trình có tên là mython, có thể tải bất kỳ thư viện được chia sẻ nào và cố gắng gọi hàm run ví dụ:

lib = dlopen("mylib.so", RTLD_LAZY); 
func = dlsym(lib, "run"); 
(*func)(); 

Vì vậy, trong cách mà bạn đã tải một mô-đun và gọi mã của nó, CPython nào đó nhưng theo cách phức tạp hơn, cung cấp giao diện tốt hơn và các đối tượng để vượt qua xung quanh, cộng với có phức tạp khác liên quan đến quản lý bộ nhớ, quản lý chủ đề v.v.

Vì vậy, nền tảng triển khai Python phải khớp với ngôn ngữ mà nó đang được mở rộng, ví dụ: CPython không mở rộng được trong Java nhưng việc thực thi Java của Python được gọi là Jython có thể được mở rộng trong Java và thực hiện .NET tương tự IronPython có thể được mở rộng bằng các ngôn ngữ .Net.

+2

Rất nhiều thứ được viết bằng C. Nhưng rất nhiều thứ được viết bằng C * không * có thể mở rộng trong C. Điều gì làm cho Python đặc biệt ? –

+0

@Anurag Có đúng là python không thể mở rộng được không, chẳng hạn như Java? – ashim

+0

@ IgnacioVazquez-Abrams xem chỉnh sửa –

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