2011-08-25 7 views
7

Vì vậy, tôi đang cố gắng để giao diện python 3.2 và C++ bằng cách sử dụng python tăng, và đã gặp rất nhiều vấn đề. Tôi cuối cùng đã nhận được nó để biên dịch bằng cách sử dụng 2,7 thư viện và nó hoạt động, nhưng tôi dường như không thể làm cho nó hoạt động với python 3.2.Xin chào thế giới với python tăng và python 3.2

Đây là mã C++

#include <iostream> 

using namespace std; 

void say_hello(const char* name) { 
    cout << "Hello " << name << "!\n"; 
} 

int main(){return 0;} 

#include <boost/python/module.hpp> 
#include <boost/python/def.hpp> 
using namespace boost::python; 

BOOST_PYTHON_MODULE(hello) 
{ 
    def("say_hello", say_hello); 
} 

Nếu tôi biên dịch nó bằng cách sử dụng 2,7 thư viện nó làm việc tốt, nhưng khi tôi sử dụng 3.2 thư viện tôi nhận được tấn tài liệu tham khảo không xác định từ libboost_python.so

Nếu không tôi đã viết một chút trăn để làm cho nó làm việc:

from distutils.core import setup 
from distutils.extension import Extension 

setup(name="PackageName", 
    ext_modules=[ 
     Extension("hello", ["testBoost.cpp"], 
     libraries = ["boost_python"]) 
    ]) 

và điều này sẽ tạo ra một vì vậy sử dụng python 3.2 hoặc 2.7 build, nhưng khi tôi mở interpr python 3 eter và cố gắng để nhập khẩu vì vậy nó cung cấp cho tôi lỗi không xác định biểu tượng PyClass_Type từ libboost_python.so một lần nữa. Bất kỳ ý tưởng? Là tăng python tương thích với python 3.x?

Nếu thông tin rất hữu ích, đây là biên dịch của tôi đã cố gắng sử dụng 3.2:

$ g++ testBoost.cpp -I/usr/include/python3.2 -I/usr/local/include/boost/python -lboost_python -lpython3.2mu 
    /tmp/ccdmU1Yu.o: In function `PyInit_hello': 
    testBoost.cpp:(.text+0xc2): undefined reference to `boost::python::detail::init_module(PyModuleDef&, void (*)())' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_Size' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyFile_FromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromStringAndSize' 
    /usr/local/lib/libboost_python.so: undefined reference to `Py_InitModule4_64' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_FromFormat' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyNumber_Divide' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyNumber_InPlaceDivide' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_AsLong' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_InternFromString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyClass_Type' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyString_AsString' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyInt_FromLong' 
    /usr/local/lib/libboost_python.so: undefined reference to `PyFile_AsFile' 
    collect2: ld returned 1 exit status 

Và lỗi từ python 3 phiên dịch là

File "<stdin>", line 1, in <module> 
ImportError: /usr/local/lib/libboost_python.so.1.47.0: undefined symbol: PyClass_Type 

Nhờ sự giúp đỡ!

+1

Bạn có thể cân nhắc xem xét SWIG thay vì Boost.Python, nếu bạn có thể.Nó đòi hỏi ít mã boilerplate hơn và tôi đã nhận nó để làm việc với Python3 khá dễ dàng trước đây. – Sean

+2

@Sean Tôi không chắc bạn đang nói về mã bản mẫu nào; tăng/python của tôi hoạt động bơi với chỉ 5 dòng mã phụ. – steventrouble

Trả lời

5

Trên đây C++ mã biên dịch thành một mô-đun với

$ g++ testBoost.cpp -I/usr/include/python3.2 -I/usr/local/include/boost/python -lboost_python3 -lpython3.2mu -o hello.so -shared 

lệnh biên dịch này cho biết thêm -lboost_python3, và -shared, và cũng là ước đặt tên cho các module mở rộng python. Bạn cũng nên cài đặt gói python3-dev và cấu hình/xây dựng/cài đặt tăng với python3, nếu bạn chưa có.

Trong python 3, Sau đó tôi có thể làm như sau:

$ python3 
Python 3.2 (r32:88445, Mar 25 2011, 19:28:28) 
[GCC 4.5.2] on linux2 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import hello 
>>> hello.say_hello('bill') 
Hello bill! 
>>> 

Bạn nên tắt để các cuộc đua tại điểm đó.

+1

Tôi đã thử sử dụng -lboost_python3 nhưng vẫn gặp lỗi tương tự và tôi đã thay đổi tệp mứt của mình để trỏ tới python 3 – Dwight

+1

Được rồi vì vậy tôi đã biên soạn với hướng dẫn của bạn và nó đã cho tôi biết cần biên dịch lại với -fpic và tôi đã kết thúc với .so. Bây giờ tuy nhiên, khi tôi cố gắng để nhập khẩu trong python, tôi nhận được một lỗi mà nói: ImportError: /usr/local/lib/libboost_python3.so.1.47.0: undefined symbol: PyClass_Type – Dwight

8

Tôi gặp sự cố tương tự, với Ubuntu 12.04. Tôi đã cài đặt phiên bản 1.48 của thư viện và phải liên kết với libboost_python-py32.so thay vì libboost_python.so Sau khi lỗi liên kết này đã biến mất.

1

Mặc dù cuộc thảo luận này cũ, chỉ dành riêng cho các kỷ lục: Sửa dự án config.jam để thay đổi phiên bản python để thiết lập của bạn

# Python configuration 
using python : 3.4 : /usr ; 

Sau đó xây dựng tăng:

./b2 clean 
./b2 --with-python link=static cxxflags="-std=c++11 -fPIC" variant=release stage 
./b2 --with-python link=static cxxflags="-std=c++11 -fPIC" variant=release install 

Lệnh sau yêu cầu đặc quyền người dùng siêu. Sau đó chuyển đến thư mục chứa mã C++ cho tiện ích mở rộng:

g++ -std=c++11 hellopy.cpp -I/usr/include/python3.4 -I/usr/local/include/boost/python -lboost_python3 -o hello.so -shared -fPIC 

Sau đó, bạn có thể nhập lời chào vào môi trường trăn.