2014-09-04 1 views
1

Я вставляю Python в мое приложение GUI, когда скрипт вызывает синтаксические ошибки, я хочу перенаправить сообщение об ошибке в текстовое поле, чтобы я мог знать, где ошибка.Как перенаправить Синтаксис Python Ошибка в текстовое поле в MFC или другой фреймворке графического интерфейса?

Мои коды очень просто:

Py_Initialize() 
PyRun_SimpleString("execfile('my.py')"); 
Py_Finalize(); 

Если файл содержит синтаксическую ошибку, он может выглядеть так:

Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
    File "my.py", line 3, in <module> 
    app=everedit.Ap 
AttributeError: 'module' object has no attribute 'Ap' 

Вышеуказанные сообщения можно увидеть в окне консоли, но теперь я хотите кэшировать эти сообщения в окне графического интерфейса пользователя. Окно GUI не имеет консоли. Я хочу выводить такие сообщения в текстовое поле.

Обратите внимание: я вставляю Python в C++, я хочу кэшировать синтаксическую ошибку Python на C++.

+0

Покажите нам, что вы пробовали. И объясните, что вы на самом деле пытаетесь сделать. 'PyParse_SimpleParseString' просто разбирает код, не запуская и даже не компилируя ничего. Это действительно то, что вы хотите? Если это так, он вернет вам 'struct_node *' для главы дерева синтаксического анализа при успешном завершении или NULL при ошибке. Вы не смогли написать чек для NULL? – abarnert

+0

Кроме того, вы действительно хотите только «SyntaxError»? Если скрипт выдает какое-то другое необработанное исключение, что вы хотите сделать? – abarnert

+0

Мои коды очень просты: Py_Initialize() PyRun_SimpleString ("execfile ('my.py')"); Py_Finalize(); Если файл содержит синтаксическую ошибку, он может выглядеть так: TraceBack (самый последний вызов последнего): Файл "", линия 1, в Файл "my.py", строка 3, в приложение = everedit.Ap AttributeError: объект 'module' не имеет атрибута 'Ap' Вышеуказанные сообщения можно увидеть в окне консоли, но теперь я хочу кэшировать эти сообщения в окне графического интерфейса. Окно GUI не имеет консоли. Я хочу выводить такие сообщения в текстовое поле. – xred

ответ

1

Поскольку документация PyRun_SimpleString ясно говорит:

Returns 0 on success or -1 if an exception was raised. If there was an error, there is no way to get the exception information.

Итак, если вы хотите получить информацию об исключении, вы должны использовать несколько функций нижнего уровня.

Между тем, когда вы используете правильную функцию, и она возвращает NULL или -1, чтобы сказать вам, произошло исключение, как вы получите информацию об исключении (и отличить SyntaxError от других исключений, по какой причине вы хотите сделать что)?

В документах C-API есть целая глава по Exception Handling. Но кратко: вы вызываете PyErr_Occurred, чтобы получить тип исключения. Затем вы вызываете PyErr_ExceptionMatches, чтобы проверить, является ли он типом, который вы хотите. Если да, используйте PyErr_Fetch, чтобы получить значение и трассировку, чтобы вы могли отформатировать их самостоятельно, или PyErr_Format, чтобы получить простую форматированную строку или что-то еще, что вы хотите. Затем вы просто извлекаете байты Unicode или ASCII из строки и помещаете их в окно графического интерфейса пользователя.

+0

Спасибо за руководство, теперь я знаю, что мне делать. – xred

-1

Используйте блок try/catch и модуль traceback (docs).

import traceback 

try: 
    PyParser_SimpleParseString(input()) 
except SyntaxError as e: 
    # There will always be one line, but we're better off still looping over the list 
    # To be extra safe! 
    for line in traceback.format_exception_only(e.__class__, str(e)): 
     print(line) # Replace this with what write to the GUI 

Это только даст вам SyntaxError: x часть, если вы хотите, отслеживающий, используйте traceback.format_exception.

+0

Спасибо. PyParser_SimpleParseString - это API Cython для python, могу ли я использовать приведенные выше коды? Он выдает ошибки: NameError: имя «PyParser_SimpleParseString» не определено – xred

Смежные вопросы