2014-12-12 1 views
-1

가 나는 C에서 간단한 Pygtk 창을 통합하고 싶습니다/C++ 응용 프로그램 (이유는 pyGtk에서 이전에 설계된 GUI 존재하게 통합 할 수있는 더 큰 GTK + (응용 프로그램) C에서)C/C++ 응용 프로그램에서 Pygtk를 사용하는 방법은 무엇입니까?

나는 분할 오류 오류가 발생

내가 한 여기에 무엇을 : 파이썬에서

=====> (tmp.py) :

#!/usr/bin/python 

#from gi.repository import Gtk, Gio 

win=Gtk.Window() 
win.connect("delete-event",Gtk.main_quit) 
win.show_all() 
Gtk.main() 

======> C/C++에서 (simple.cpp) :

난 그냥 그 작은 창에게 내가 어떤 방법으로 컴파일

#include <Python.h> 

int main(int argc, char *argv[]) 
{ 
    Py_SetProgramName(argv[0]); /* optional but recommended */ 
    Py_Initialize(); 

    FILE *fp  = fopen ("tmp.py", "r+"); 

    PyObject *mainModule = PyImport_AddModule("__main__"); 

    PyObject * subModules = PyList_New(0); 
    PyList_Append(subModules, PyString_FromString("Gtk")); 
    PyList_Append(subModules, PyString_FromString("Gio")); 

    PyObject *Gtkstuff = PyImport_ImportModuleEx("gi.repository",NULL,NULL,subModules); 

    PyObject *GtkMod =PyObject_GetAttr(Gtkstuff,PyString_FromString("Gtk")); 
    PyObject *GioMod =PyObject_GetAttr(Gtkstuff,PyString_FromString("Gio")); 

    PyModule_AddObject(mainModule, "Gtk", GtkMod); 
    PyModule_AddObject(mainModule, "Gio", GioMod); 

    PyRun_SimpleFile(fp,"tmp.py"); 
    Py_Finalize(); 
    return 0; 
} 

방법을 실행하려는입니다

g++ $(python-config --cflags) -o simple $(python-config --ldflags) ./simple.cpp 

출력 :

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "/usr/lib64/python2.7/site-packages/gi/importer.py", line 68, in load_module 
    dynamic_module._load() 
    File "/usr/lib64/python2.7/site-packages/gi/module.py", line 291, in _load 
    overrides_modules = __import__('gi.overrides', fromlist=[self._namespace]) 
    File "/usr/lib64/python2.7/site-packages/gi/overrides/Gtk.py", line 1502, in <module> 
    initialized, argv = Gtk.init_check(sys.argv) 
AttributeError: 'module' object has no attribute 'argv' 
Traceback (most recent call last): 
    File "tmp.py", line 5, in <module> 
    win=Gtk.Window() 
    File "/usr/lib64/python2.7/site-packages/gi/overrides/Gtk.py", line 415, in __init__ 
    if not initialized: 
NameError: global name 'initialized' is not defined 
+0

어떤 python 버전을 사용하고 있습니까? –

+0

python2.7이고 pygtk는 버전 3입니다. –

+0

'Py_SetProgramName' 함수가'wchar_t * '대신'char *'인수를 사용하는지 확인하십시오. 그리고'g ++'가 필요없는 C 컴파일러를 사용하십시오. 'simple.cpp '대신'simple.c' 파일의 이름을 바꾸고'gcc $ (python-config --cflags) -o simple $ (python-config --ldflags) simple.c'로 컴파일하십시오. –

답변

0

이 완벽하게 작동, 코드의 나머지 부분 파이썬 스크립트에서 모든 초기화 작업을 수행 할 수 있으므로 나에게 이해가되지 않는다.

#include <Python.h> 

int main(int argc, char *argv[]) 
{ 
    Py_SetProgramName(argv[0]); /* optional but recommended */ 
    Py_Initialize(); 

    FILE *fp = fopen("tmp.py", "r"); 
    if (fp == NULL) 
     return 2; 

    PyRun_SimpleFile(fp, "tmp.py"); 
    Py_Finalize(); 

    fclose(fp); 
    return 0; 
} 
+0

필자는'pygtk' 응용 프로그램이 없으므로 내 시스템에 설치되지 않았기 때문에'pygtk'로 시도하지 않았습니다. 그러나'numpy'를 가져온 간단한 스크립트가 제대로 작동했습니다. –

+0

덕분에 iharob는 좋은 소식이지만 전체 프로그램의 이유는 GUI (pygtk)입니다. 당신은 PySetPramName에게 char *를 넘겨 주겠다고 말했습니다. .... 나는 당신을 잃어 버렸습니다. –

+0

'pygtk'를'tmp.py' 안에 넣을 수 있습니다. 'PyRun_SimpleFile (fp, "tmp.py")'가 파일에서 파이썬 스크립트를 실행하려고하면 스크립트에 무엇이 있는지 상관하지 않습니다. 'python tmp.py'를 실행하는 것과 같습니다. 명령 행 그리고'Py_SetProgramName'에 대해서'sizeof (wchar_t)! = sizeof (char)' –

관련 문제