2010-01-07 4 views
11

Tôi đang sử dụng thư viện Boost Python để tạo các phần mở rộng python cho mã C++ của tôi. Tôi muốn để có thể gọi từ trăn chức năng 'Greet' từ C++ mã hiển thị bên dưới:xây dựng tăng các ví dụ python bằng cách sử dụng Visual Studio 2008

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 

char const* greet() 
{ 
    return "hello, world"; 
} 

BOOST_PYTHON_MODULE(hello_ext) 
{ 
    using namespace boost::python; 
    def("greet", greet); 
} 

Và mã python:

import hello_ext 
print hello_ext.greet() 

tôi đã quản lý để thực hiện điều này bằng cách sử các bjam (hello_ext.pyd được tạo ra và nó hoạt động tốt đẹp), nhưng bây giờ tôi muốn xây dựng nó bằng cách sử dụng Visual Studio 2008. Một hello.dll được xây dựng (nhưng không hello_ext.dll cũng không phải bất kỳ .pyd). Sau khi gọi mã python của tôi, tôi gặp lỗi:

NhậpError: Không có mô đun nào có tên hello_ext.

Sau khi đổi tên các hello.dll để hello.pyd hoặc hello_ext.pyd, tôi nhận được ImportError khác: tải DLL thất bại

Làm thế nào tôi có thể xây dựng các tập tin .pyd đúng bằng VS 2008?

+0

Đối với những người quan tâm đến việc xây dựng một dự án như vậy với một makefile (và gcc), xem http://stackoverflow.com/questions/2003506/how-to-build-a-boost-dependent-project-using-regular-makefiles/2055958#2055958 – rafak

Trả lời

0

Hãy đảm bảo bạn có cờ -lpython26 (nếu bạn đang sử dụng python2.6) và tên tệp phải là hello_ext.pyd trong trường hợp của bạn.

10

Trước tiên, hãy đảm bảo bạn chỉ cố gắng nhập phiên bản phát hành từ Python; việc nhập phiên bản gỡ lỗi sẽ không thành công vì các phiên bản thư viện thời gian chạy không khớp. Tôi cũng thay đổi thuộc tính dự án của tôi để các phiên bản phát hành kết quả đầu ra một tập tin .pyd:

Thuộc tính >> Linker >> Output:

$(OutDir)\$(ProjectName).pyd 

(Tôi cũng tạo ra một hậu xây dựng hành động để chạy thử nghiệm đơn vị từ python)

Tiếp theo, hãy chắc chắn bạn định nghĩa sau đây trong tập tin stdafx.h của bạn:

#define BOOST_PYTHON_STATIC_LIB 

Cuối cùng, nếu bạn có nhiều hơn một phiên bản python cài đặt, hãy chắc chắn rằng bạn đang i mporting phiên bản đúng của python.h (trong Công cụ >> Tùy chọn >> Dự án và Giải pháp >> Thư mục VC++ >> Bao gồm tệp).

5

Các lỗi ImportError: tải DLL thất bại thường có nghĩa là mô-đun .pyd bạn phụ thuộc vào DLL khác mà không thể được tìm thấy - thường msvc * .dll. Bạn có thể thử mở tệp .pyd trong Notepad và tìm kiếm ".dll". Sau đó kiểm tra xem tất cả các phụ thuộc DLL tồn tại trong thư mục của bạn hay PATH.

Hoặc sử dụng Dependency Walker mà sẽ tìm phụ thuộc thiếu cho bạn

1

Mặc dù đây là một câu hỏi đưa ra cách đây vài năm (vẫn không dễ dàng để tìm giải pháp), nhưng tôi gặp cùng một vấn đề ngày hôm nay, và sau giờ tìm kiếm, cuối cùng tôi đã tìm ra một giải pháp khả thi.

  • Lý do là chỉ đơn giản như được chú ý bởi @AndiDog, file .pyd bạn xây dựng phụ thuộc vào một số khác .dll;
  • Trong trường hợp của tôi, Đó là boost_python-vc120-mt-1_58.dll dưới thư mục [C tăng folder ++]/giai đoạn/lib/
  • Vì vậy, những gì tôi làm là để sao chép tập tin này, và dán nó trong thư mục tập tin .pyd, và sau đó python tôi có thể đúng nhập dự án tôi xây dựng.

  • có thể có một số giải pháp khác, đó là xây dựng dự án của bạn không phụ thuộc vào thư viện động, thay vào đó hãy sử dụng thư viện tĩnh. một số nguồn cho biết để xác định BOOST_PYTHON_STATIC_LIB trong Bộ xử lý trước, sau đó dự án của bạn sẽ không phụ thuộc vào thư viện động (Tôi là một C++ mới), nhưng chắc chắn bạn đã xây dựng libboost_python-vcXXX-mt-1_58.dll tăng.

  • để xác định Preprocessor, tuyến đường này là: C/C++ -> Preprocessor-> Preprocessor Definitions-> chỉnh sửa BOOST_PYTHON_STATIC_LIB