2009-06-02 4 views
10

나는 파이썬 코드를 앱에 삽입하기 위해 boost :: python을 사용하고 있습니다. print 문이나 다른 표현식을 제대로 평가할 수 있었지만 모듈을 가져 오려고하면 가져 오기가되지 않아 응용 프로그램이 종료되었습니다. 또한 임베디드 코드에서 globals() 함수 호출도 런타임 오류를 발생시킵니다. 여기boost :: python embedded 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); 
} 

가, 내가 부스트 가져 오기 기능을 사용하여 urllib2가 가져올 시도했습니다,이 컴파일하고 제대로 실행되지만 다음과 같은 임원 문, 에러를 제공합니다.

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

또는 부스트 가져 오기 기능을 제거하고 포함 된 코드에서 가져 오기를 수행하면 오류가 발생합니다. try : except : 블록을 사용해 보았지만 그 중 하나는 작동하지 않습니다. 이것은 C++ 응용 프로그램이 urllib2 py 모듈 또는 다른 위치를 찾을 수 없기 때문입니까? 가져 오기 전에 모듈의 경로를 설정하는 방법이 있습니까?

이것은 내부 용으로 만 제작되었으므로 경로를 하드 코딩 할 수 있습니다.

편집 : 추가 정보 :
이 일어나는 것입니다. try ... catch를 수행하고 예외가 발생하면 PyErr_Print()를 호출하여 모듈 가져 오기 또는 함수 호출이있을 때 항상 오류로 처리합니다. 오류 메시지 :

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

아무 이유없이 생각할 수 있습니까? 당신이 이미하지 않은 경우

답변

3

그건 도움이되지 않았지만 문제에 대한 다른 해결책을 발견했습니다. 내 현재 코드는 다음과 같습니다 : 어쨌든

#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(); 
     } 
} 

, 조나스

+0

@Jonas. 그걸로 무엇을하고 싶니? –

+0

오. 나는 C++ 소켓 라이브러리에 완전히 지쳤다. 그들은 이해할 시간이 필요하며, 나는 컴퓨터 학생이 아니기 때문에, 이해하는 데 오랜 시간이 걸린다. 그래서 저는 비동기 urllib ++와 같은 느낌의 것을 비단뱀 urllib2와 함께 작성했습니다. : D 나는 그것이 미친 소리가 나는 것을 안다. 하지만 지금은 매우 편리한 솔루션이 있습니다! – Sahas

+0

안녕하세요, 당신에게 좋습니다! –

4

, 당신은 부스트 ​​:: 파이썬 (파이썬 V2.5)를 삽입 할 때 몇 년 전에 내 문제 처리했다

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

해야합니다.

편집 :

이전 코드에서 주변 찌르고.

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

당신이 Py_SetProgramName() 필요 정말 것이 확실 소리,하지만 희미하게 거기에 약간의 비린내가 사업을 기억 : 아마도이 트릭을 수행합니다.

+0

답장을 보내 주셔서 감사 드리며 실제로 시도해 보시고 지연시켜 주셔서 감사합니다. 조나스. 시도했지만 도움이되지 않았습니다. 나는이 단일 문장 "print globals() \ n"이 있으면 프로그램을 실행할 수조차 없다. Windows와 Linux에서 동일한 코드를 사용해 보았습니다. 부스트 1.39.0을 사용하고 있습니다. – Sahas

+0

죄송합니다. 나는 편집을 알아 채지 못했습니다. 나는 그것을 시도 할 것이다. – Sahas

+1

특정 라이브러리 (예 : gzip 또는 numpy)를 가져올 때 신비한 세분화 오류가 발생했습니다. 다음이 해킹 매력과 같은 문제를 해결 : 'Py_SetProgramName를 ("");' 'Py_InitializeEx (0) 당신은 당신의 코드가 작동있어' 감사 다행 –

0

난 당신이, IEA 아주 간단한 예는 형식 오류의 결과로 같은 문제로 달리고, this question에서 답을 찾을 답을 주셔서 감사합니다, 이는 네임 스페이스를 전역 및 로컬로 두 번 제공하는 것이 었습니다.

관련 문제