2009-06-02 12 views
10

私はいくつかのPythonコードをアプリに埋め込むためにboost :: pythonを使用しています。私はprintステートメントや他の式を適切に評価することができましたが、モジュールをインポートしようとすると、インポートされず、アプリケーションが終了しています。さらに、埋め込みコード内の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); 

また、ブーストインポート機能を削除して埋め込みコードからインポートすると、エラーが発生します。 try:except:blockを使ってみましたが、どちらもうまくいきません。これは、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 ++のようなものを、後ろのpython urllib2で作成しました。私は狂ったように聞こえる。しかし、私は今非常に便利なソリューションを持っています! – Sahas

+0

Hehe、よろしく! –

4

あなたがまだの場合は、ブースト::のpython(パイソン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

ためのおかげで、私は、例外TypeErrorが得られ、非常に簡単な例をIEA、あなたと同じ問題に遭遇した、とthis questionで答えを見つけましたこれはグローバルとローカルの両方の名前空間を2度提供することでした。

関連する問題