2009-06-02 27 views
10

Tôi đang sử dụng boost :: python để nhúng một số mã python vào một ứng dụng. Tôi đã có thể nhận được báo cáo in hoặc các biểu thức khác để được đánh giá đúng cách, nhưng khi tôi cố gắng nhập mô-đun, nó không phải là nhập khẩu và ứng dụng đang thoát. Hơn nữa hàm globals() trong mã nhúng cũng cung cấp một lỗi thời gian chạy.Làm cách nào để nhập mô-đun tăng cường :: mã python được nhúng python?

#include <boost/python.hpp> 

using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
    Py_Initialize(); 
    object main_module = import("__main__"); 
    object main_namespace = main_module.attr("__dict__"); 
    main_namespace["urllib2"] = import("urllib2"); 

    object ignored = exec(
      "print 'time'\n", main_namespace); 
} 

Ở đây, tôi đã cố gắng nhập urllib2 bằng chức năng nhập tăng cường, biên dịch này và chạy đúng cách, nhưng với câu lệnh exec sau đây, nó đưa ra lỗi.

object ignored = exec(
      "print urllib2\n" 
      "print 'time'\n", main_namespace); 

Hoặc khi tôi xóa chức năng nhập tăng và thực hiện nhập từ bên trong mã nhúng, nó cũng sẽ gây ra lỗi. Tôi đã thử bằng cách sử dụng một thử: ngoại trừ: khối nhưng điều đó không hoạt động hoặc. Có phải vì ứng dụng C++ không thể tìm thấy vị trí của mô-đun pyll urllib2 hay gì đó? Có cách nào để đặt đường dẫn của mô-đun trước khi cố gắng nhập không?

Điều này đang được xây dựng chỉ để sử dụng nội bộ, vì vậy một số mã hóa cứng của các đường dẫn là chấp nhận được.

Chỉnh sửa: Thông tin khác:
Đây là những gì sẽ xảy ra. Tôi đã làm một thử .. bắt và gọi PyErr_Print() khi bao giờ có một ngoại lệ, và có điều này như là lỗi tất cả các thời gian khi có mô-đun nhập khẩu hoặc thậm chí các cuộc gọi chức năng. Thông báo lỗi:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
TypeError: 'NoneType' object does not support item assignment 

Có ai có thể nghĩ ra lý do nào không?

Trả lời

3

Điều đó không hữu ích, nhưng tôi đã tìm ra giải pháp khác cho vấn đề của mình. mã hiện tại của tôi trông như thế này:

#include <boost/python.hpp> 
#include <iostream> 

using namespace std; 
using namespace boost; 
using namespace boost::python; 
using namespace boost::python::api; 

int main(void) { 
     Py_Initialize(); 
     boost::python::object http = boost::python::import("urllib2"); 

     try 
     { 
       boost::python::object response = http.attr("urlopen")("http://www.google.com"); 
       boost::python::object read = response.attr("read")(); 
       std::string strResponse = boost::python::extract<string>(read); 
       cout << strResponse << endl; 
     } 
     catch(...) 
     { 
       PyErr_Print(); 
       PyErr_Clear(); 
     } 
} 

Anyways, cảm ơn cho câu trả lời Jonas

+0

Vui mừng bạn đã nhận mã của bạn làm việc. Bạn muốn làm gì với cái này? –

+0

Ồ. Tôi đã hoàn toàn bị bệnh của các thư viện ổ cắm C++. Họ cần thời gian để hiểu, và vì tôi không phải là sinh viên máy tính, tôi mất nhiều thời gian để hiểu hơn. Vì vậy, tôi tạo ra một cái gì đó mà cảm thấy giống như một urllib không đồng bộ + + với pyll urllib2 ở phía sau. : D Tôi biết nó nghe có vẻ điên rồ. Nhưng bây giờ tôi có một giải pháp cực kỳ tiện lợi! – Sahas

+0

Hehe, tốt cho bạn! –

4

Nếu bạn chưa có, bạn cần phải

 
import sys 
sys.path.append("/home/user/whatever") 

Đó đã chăm sóc của các vấn đề của tôi một vài năm trước, khi nhúng boost :: python (Python v2.5).

Chỉnh sửa:

Khẩn cấp trong mã cũ. Có lẽ điều này làm các trick:

 
Py_SetProgramName(argv[0]); 
Py_InitializeEx(0); 

Âm thanh chắc chắn rằng bạn thực sự cần cần Py_SetProgramName(), nhưng tôi lờ mờ nhớ một số doanh nghiệp tanh ở đó.

+0

Cảm ơn bạn đã phản hồi, và thực sự cho sự chậm trễ trong việc thử nó và nói với bạn, Jonas. Tôi đã thử nhưng điều này không giúp ích gì. Tôi thậm chí không thể chạy chương trình nếu nó có câu lệnh đơn "print globals() \ n". Tôi đã thử cùng một mã trên cửa sổ và Linux, và cùng một phản ứng ở khắp mọi nơi. Tôi đang sử dụng Boost 1.39.0 – Sahas

+0

Rất tiếc. Tôi đã không nhận thấy bản chỉnh sửa. Tôi cũng sẽ thử. – Sahas

+1

Tôi đã gặp lỗi phân đoạn bí ẩn khi nhập một số thư viện nhất định (chẳng hạn như gzip hoặc numpy). Sau đó hack này giải quyết vấn đề như một nét duyên dáng: 'Py_SetProgramName (""); ' ' Py_InitializeEx (0);' Cảm ơn @Jonas –

0

Tôi chạy vào cùng một vấn đề như bạn, IEA ví dụ rất đơn giản dẫn đến việc TypeError, và tìm thấy câu trả lời trong this question, đó là cung cấp không gian tên hai lần, cả trên toàn cầu lẫn cục bộ.

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