2011-11-06 806 views
37

Tôi vừa biên soạn một phần của thư viện C của tôi như là một phần mở rộng sử dụng Cython, như là một "bằng chứng về khái niệm". Tôi quản lý để hack mã (const correctnes vấn đề vv sang một bên), để cuối cùng có được một phần mở rộng được xây dựng.Cython biên dịch C mở rộng: ImportError: mô-đun năng động không xác định chức năng init

Tuy nhiên, khi tôi cố gắng để nhập phần mở rộng mới được tạo ra, tôi đã nhận lỗi sau:

ImportError: dynamic module does not define init function 

Tôi đang làm gì sai và làm thế nào để sửa lỗi này?

Tôi đang sử dụng Cythn 0.11.2 và Python 2.6.5 trên Ubuntu 10.0.4

+1

lệnh gì dòng bạn đã sử dụng để tạo ra các c? Làm thế nào bạn biên dịch nó? – tito

+0

Tôi chưa nhận được phản hồi về [câu hỏi Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) liên quan đến lỗi biên dịch. Bạn có thể giúp đỡ. – Phillip

Trả lời

56

tôi đã tìm thấy rằng một nguyên nhân thường xuyên của vấn đề này là, khi sử dụng một tập tin cài đặt distutils để biên dịch mã, mà tên cơ sở .pyx không phù hợp với tên mở rộng, ví dụ:

ext = Extension(name='different', sources=['cython_ext.pyx']) # Won't work 

Để tránh sự cố, tên tiện ích phải giống hệt nhau, trong trường hợp này là cython_ext.

+0

Cuộc gọi đẹp. Có ai biết lý do tại sao điều này hoạt động, và tại sao một tên khác không? – dinkelk

+0

Tôi chưa nhận được phản hồi về [câu hỏi Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) liên quan đến lỗi biên dịch. Bạn có thể giúp đỡ. – Phillip

+0

@dologan, cảm ơn bạn rất nhiều vì đã cứu tôi một ngày! – q0987

3

Đây là một câu trả lời rất muộn - nhưng tôi chỉ có lỗi tương tự, và tôi ra đi khi tôi sử dụng __cinit__ thay vì __init__. Tôi vẫn còn learing về các loại mở rộng vì vậy hiện tại tôi không biết tại sao điều này xảy ra. :) (Bạn có thể xem http://docs.cython.org/src/reference/extension_types.html#initialization-cinit-and-init) Hy vọng điều này rất hữu ích cho ai đó.

+0

Tôi chưa nhận được phản hồi về [câu hỏi Cython] (http://stackoverflow.com/questions/41926482/cython-compileerror-when-attempting-to-compile-extension-type) liên quan đến lỗi biên dịch. Bạn có thể giúp đỡ. – Phillip

16

Dường như đó là lỗi/tính năng trong Cython. Tôi có cùng một điều, nhưng chỉ cần thêm:

STUFF = "Hi" 

lên đầu tệp .pyx của tôi và sự cố đã biến mất. Nó xuất hiện nếu không có khởi tạo toàn cầu (một cinit hoặc thiết lập một biến toàn cầu), rằng mã khởi tạo yêu cầu không được tạo ra.

+3

Wow. Tôi không thể tin rằng thực sự làm việc, nhưng nó cố định cùng một lỗi trong thư viện của tôi. – Rick

+0

Điều này cũng phù hợp với tôi .. Tôi không tin. – coffeepls

0

Tương tự như câu trả lời trễ ... nhưng tôi vẫn tìm cách quay lại câu hỏi này một cách cụ thể. Nó có thể liên quan đến vấn đề tên không khớp mà Dologan đề cập đến.

Điều xảy ra trong trường hợp của tôi là tôi đã thích ứng với một ví dụ mà tôi muốn làm việc và gặp lỗi module does not define init function. Điều này đã được xác nhận qua sử dụng (ví dụ)

nm -m build/lib.macosx-10.9-x86_64-2.7/myproj.so

Trong đầu ra của lệnh này, tôi đã tìm kiếm cho 'init' và thấy

000000000000c0d0 (__TEXT,__text) external _initexample

tôi đã loại bỏ tất cả các trường hợp của 'dụ' từ tập tin setup.py và .pyx của tôi , nhưng điều này vẫn tồn tại ngay cả sau khi loại bỏ phần mở rộng từ site-packages, loại bỏ các thư mục xây dựng và phân phối, vv Cuối cùng tôi đã tìm thấy tệp .cpp được tạo từ tệp .pyx của tôi vẫn đang đề cập đến tên lớp trong ví dụ. Khi tôi reran công trình setup.py, nhập khẩu của tôi, và thực sự tập .so bao gồm

000000000000c0a0 (__TEXT,__text) external _initmyproj

0

Tôi hiện đang học Cython với cuốn sách O'Reilly, và phải đối mặt với cùng một vấn đề. Điều gì đã giải quyết được vấn đề đối với tôi là thêm một docstring vào hàm.

này đã không làm việc:

def fib(int n): 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a 

này làm việc:

def fib(int n): 
    '''Returns the nth Fibonacci number.''' 
    cdef int i 
    cdef double a=0.0, b=1.0 
    for i in range(n): 
     a, b = a + b, a 
    return a