2010-11-04 17 views
5

Tôi không thể sao chép ví dụ SWIG cơ bản trên cửa sổ. Lỗi của tôi được nêu trong tài liệu SWIG và tôi chắc chắn rằng tôi thực hiện 2 bản sửa lỗi mà họ đề cập đến. Đối với lỗi này:swig không có mô-đun có tên _example

>>> import example 
Traceback (most recent call last): 
    File "<stdin>", line 1, in ? 
    File "example.py", line 2, in ? 
    import _example 
ImportError: No module named _example 

tài liệu SWIG nêu rõ:

quên gạch hàng đầu (_). .

quên gạch hàng đầu (_)> Nếu bạn nhận được thông báo này, nó có nghĩa là

you either forgot to compile the wrapper code into an extension module or you didn't give the extension module the right name. Make sure that you compiled the wrappers into a module called example.so. And don't forget the leading underscore ().forget the leading underscore (_).

và tôi chắc chắn rằng tôi liên kết với tất việc xây dựng đối tượng bọc và tôi đã tryied: "_example" , "_example.so", "example.dll", "example.so", "example.dll", ngay cả cùng một lúc và "example.py" được tạo trong cùng thư mục với thư viện được chia sẻ, và rằng đường dẫn python chứa thư mục này cho phép gạch dưới hàng đầu ().

ví dụ:

//example.h 
int foo_sum(int a, int b); 

.

//example.cpp 
int foo_sum(int a, int b) { 
    return a + b; 
} 

.

//example.i 
%module example 
%{ 
#include "example.h" 
%} 

#include "example.h 

và xây dựng các lệnh:

gcc -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample_wrap.o ..\example_wrap.c 
g++ -IV:\temp\example\external\include\Python -O3 -Wall -c -fmessage-length=0 -oexample.o ..\example.cpp 
g++ -LV:\temp\example\external\lib -shared -oexample.dll example_wrap.o example.o -lpython26 

ngay cả khi tôi không sử dụng O3 nó vẫn không hoạt động (Tôi dán xây dựng các lệnh từ một cấu hình Release)

tôi cũng đã cố gắng này và không thành công:

>>> import sys 
>>> sys.path.append("/your/module/path") 
>>> import example 

EDIT:

dường như nó tải dll nếu bạn đổi tên nó thành "_example.pyd", NHƯNG module nạp không chứa "foo_sum" của tôi chức năng

EDIT: nó hoạt động bây giờ, tôi đang sử dụng extern "C" và không bao gồm tiêu đề trong tệp .i

+11

Bạn nên viết câu trả lời của mình trong câu trả lời và đánh dấu câu trả lời là chính xác - (bạn sẽ có được huy hiệu tự học). Nó ngăn chặn những người như tôi tìm kiếm câu hỏi của bạn trên danh sách chưa được trả lời chỉ để tìm thấy mọi thứ đều ổn. – Tom

Trả lời

0

Tôi thấy bạn phải đổi tên tệp thư viện mà C++ tạo từ .dll thành .pyd trên cửa sổ. Tôi không thể nhớ nếu bạn cần đổi tên nó trên quả táo. và chức năng của bạn mà bạn muốn để lộ đến python phải có extern "C" trước nó. Nếu không trình biên dịch sẽ không làm cho hàm có thể truy cập được bên ngoài thư viện. Ngoài ra Nếu tôi nhớ lại bạn cần phải bọc các giá trị trả về trong một Py_value nếu bạn muốn sử dụng chúng trong python.

2

Tên tệp của thư viện phải là * .pyd. Tôi cho rằng bạn đã tạo ra một mã bao bọc và liên kết nó với nhau.

0

Tôi thấy rằng (trong cửa sổ), nếu bạn tạo một dll, nó phải được gọi là _modulename.pyd Thư viện này (_modulename.pyd), mô-đun C++ gốc myapp.dll và kết quả là modulename.py phải là trong đường dẫn cũng như pythonxx.exe

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