2009-06-02 176 views
10

我使用boost :: python將一些python代碼嵌入到應用程序中。我能夠正確評估打印語句或其他表達式,但是當我嘗試導入模塊時,它不是導入並且應用程序正在退出。此外,嵌入式代碼中的globals()函數調用也會產生運行時錯誤。如何在boost :: python嵌入式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使用升壓導入功能,這個編譯和運行正常,但有以下exec語句,它給出了一個錯誤。

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

或者當我刪除boost導入函數並從嵌入代碼中進行導入時,它也會報錯。我嘗試使用一個嘗試:除了:塊,但也不起作用。這是因爲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(); 
     } 
} 

不管怎麼說,謝謝你的答案喬納斯

4

如果你還沒有,你需要

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

這嵌入的boost ::蟒(Python的V2.5)當幾年前花了我的問題護理。

編輯:

在舊代碼中捅了一圈。也許,這是卓有成效的:

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

聽起來不確定,你應該真正需要的Py_SetProgramName(),但我依稀記得一些可疑的商業存在。

+0

感謝您的迴應,並且真的是爲了延遲嘗試並告訴您,Jonas。 我試過了,但這沒有幫助。如果它有這個單一語句「print globals()\ n」,我甚至無法讓程序運行。我在Windows和Linux上嘗試了相同的代碼,並且在任何地方都有相同的響應。 我正在使用Boost 1.39.0 – Sahas 2009-06-07 05:25:01

+0

糟糕。我沒有注意到編輯。我也會嘗試。 – Sahas 2009-06-16 04:51:52

0

我遇到同樣的問題,因爲你,IEA很簡單的例子導致類型錯誤,並找到了答案在this question,即提供名稱空間兩次,包括全局和本地。