2011-07-27 25 views
5

Tôi đã viết thư viện bằng C. Tôi sử dụng SWIG để tạo các ràng buộc cho Java, Python, v.v. Tôi đã quản lý để viết bản đồ kiểu tùy chỉnh cho cả hai ngôn ngữ và vân vân. Tôi cũng quản lý để sử dụng thư viện của tôi (một giao thức tùy chỉnh) và giao tiếp với một máy chủ mà tôi đã viết trong C, với một khách hàng mà tôi đã viết bằng Java và, với một khách hàng mà tôi đang viết bằng Python.Lỗi nhập SWIG và Python3

Gần đây, tôi đã gặp một vấn đề đa thừa kế với một số solution Tôi đã tìm thấy thông minh. Tuy nhiên, khi cố gắng tái tạo lỗi bằng cách sử dụng Python 3, lỗi đã biến mất (có thể trong phiên bản 3 được giải quyết). Thực tế là, cùng một mã, cùng một dự án và cùng một nguồn sẽ không chạy gọi mã nhị phân python3, nhưng nó hoạt động gọi python2.7 nhị phân.

Tôi nhận được thông báo:

ImportError: dynamic module does not define init function (PyInit__pytellapic) 

Mà tôi đã đọc những gì có thể có nghĩa là từ tài liệu SWIG với một lỗi hơi khác nhau:

import example 
Traceback (most recent call last): 
File "<stdin>", line 1, in ? 
ImportError: dynamic module does not define init function (init_example) 

Nói rằng:

This error is almost always caused when a bad name is given to the shared object file. For example, if you created a file example.so instead of _example.so you would get this error. Alternatively, this error could arise if the name of the module is inconsistent with the module name supplied with the %module directive. Double-check the interface to make sure the module name and the shared object filename match. Another possible cause of this error is forgetting to link the SWIG-generated wrapper code with the rest of your application when creating the extension module.

Trung thực , Tôi nghĩ rằng nguyên nhân có thể xảy ra này sẽ không áp dụng cho các mô-đun của tôi, vì nó phải là lỗi cho 2. Phiên bản 7 và 3 của python, không chỉ cho Python 3.

Tôi rất cảm kích, nhưng xem xét SWIG có vẻ là một dự án lỗi thời, có lẽ tôi sẽ tiếp tục sử dụng Python 2.7 với "hack" đã đề cập.

Trân trọng,

Trả lời

2

Mô-đun C được tạo có hàm PyInit__pytellapic được xác định không?

Tên và cấu hình nếu phương thức init mô-đun đã thay đổi trong Python 3. Nếu bạn muốn chính xác cùng một mã C để chạy theo cả Python 2 và Python 3, bạn phải bao gồm cả tên cũ và tên mới. Xem chương Migrating C Extensions để biết thêm thông tin.

Theo SWIG's documentation SWIG 2.0 phải thực hiện việc này nếu bạn chuyển thông số -py3, nhưng tôi chưa thử.

+0

Trong mối quan tâm tham số -py3, tôi phải nói rằng tôi đã thử nó mà không thành công. Tôi cũng đã thử các cờ khác được liệt kê trong 'swig -python -help' mà không may mắn. Trong một vài phút (có thể là giờ) tôi đang đọc phần mở rộng C đó. Cảm ơn bạn đã hướng dẫn và trả lời. – Sebastian

+0

Tôi thêm một bình luận khác để tránh pha trộn và làm một mớ hỗn độn với cái này. Trả lời câu hỏi của bạn, tôi đã thực hiện một grep mà kết quả trong: '# define SWIG_init PyInit__pytellapic' thành thật mà nói, tôi không biết tại sao tôi nhận được lỗi đó. – Sebastian

+0

@Sebastian: Đăng mã mà SWIG tạo ra có thể hữu ích, nhưng tôi nghi ngờ bạn cần hỏi trên danh sách gửi thư SWIG. Bạn * có vẻ * đang làm điều đúng đắn đánh giá từ tài liệu. –