2011-08-10 5 views
0

Qt guiアプリケーションをPythonでブースト・モジュールとして実行できますか?これは標準のC++実行可能ファイルとして機能していましたが、今は共有ライブラリにコンパイルしてPythonから起動しようとしています。今は、インタプリタからsimpleMain()を実行するたびに、Pythonインタプリタに入ります。私がインタプリタを閉じると、毎回新しい "Python 2.7.1+(r271:86832、2011年4月11日、18:05:24)"という挨拶があり、私のプログラムはsegfaultsになります。また、私はpythonリストをchar * に変換する方法がわからないので、main関数を直接呼び出すことはできません。 charの文字列は自然に壊れているようです。ブースト・パイソン・モジュールによるC++ Qtアプリケーションの実行

これは、それを起動するために私のpythonのコードです:

import libsunshine 

libsunshine.simpleMain() 

、ここでは私のC++コードです:

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

BOOST_PYTHON_MODULE(libsunshine) 
{ 
    def("say_hello", say_hello); 
    def("simpleMain", simpleMain); 
    def("main", main); 
} 

int simpleMain() 
{ 
    char* args[] = {}; 
    main(0,args); 
} 

int main(int argc, char *argv[]) 
{ 
    QApplication a(argc, argv); 
    Sunshine w; 
    w.show(); 
    return a.exec(); 
} 

答えて

0

あなたは

のように単純である、PyQtはにあなたのアプリケーションのセットアップを書くことができます
import sys 
from PyQt4 import QtGui  
QtGui.QApplication(sys.argv) 

スクリプトの冒頭にあります。その後、あなたのモジュールでC++コードを呼び出すことができます。 (私はこのように動作するコードを持っています)

おそらくsegfaultの理由かもしれない、C++でmainを呼び出すことは不正だと思います。

+0

を試してみてはメイン呼び出すことが、それは違法ですか?それは、慣例によってmainという名前の別の関数です。しかし、私は心からC++の標準を知らないので、私はここで間違っているかもしれません。 – Torp

+0

@Torp:それに関する[質問はあります](http://stackoverflow.com/questions/4518598/is-it-legal-to-recurse-into-main-in-c)他も同様) – eudoxos

+0

ああ。リンケージは実装定義です。私はコンパイラの作家が特別なやり方でそれを扱うことを気にしないと思います。この場合、main()をinit()という名前に移動し、boostから直接呼び出すことができ、それ以外の場合はmainから呼び出すことができます。また、モジュールとしてコンパイルするときにmain()を#ifdefすることもできます。 – Torp

0

うーん通常、メインは何のparamsがなくても

argc == 1 

argc[0]実行可能ファイル名であることと呼ばれています。

また、argvは、何も渡していない間にヌルポインタで終わる文字列へのポインタのリストであると予想されます。 QApplicationが引数リストをどのように解析するか(argcに応じてループするか、単にnullポインタを探すかもし​​れません)に応じて、argcが0になってもクラッシュする可能性があります。

char *args[1] = { NULL }; main(0, args); 

または

char *args[2] = { "Dummy name", NULL }; main(1, args); 
関連する問題