Russian Qt Forum

Qt => Общие вопросы => Тема начата: Igors от Октябрь 30, 2013, 22:09



Название: PythonQt (пр-во имен)
Отправлено: Igors от Октябрь 30, 2013, 22:09
Добрый день

Код
C++ (Qt)
// cpp
context->registerClass(&vec::staticMetaObject, "", PythonQtCreateObject<vec>);  
 
// python
pt = vec()
 
Ошибка в пытоне - не видит класса vec (хотя я могу добавить переменную такого типа из cpp приложения, но создать в пытоне нет). Так работает

Код
C++ (Qt)
// cpp
context->registerClass(&vec::staticMetaObject, "example", PythonQtCreateObject<vec>);  
 
// python
import from PythonQt.example vec
pt = vec()
 
Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?

Спасибо


Название: Re: PythonQt (пр-во имен)
Отправлено: Old от Октябрь 30, 2013, 23:02
Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?
Не знаю точно как там в PythonQt и проверять лень, но я бы вначале попробовал:
PythonQtObjectPtr PythonQt::importModule( const QString &name )
или выполнял бы импорт нужного модуля выполняя питоновский код через:
QVariant PythonQtObjectPtr::evalScript( const QString &script, int start = Py_file_input )

P.S. Кстати, в предыдущей теме второй вариант с исполнением питоновского импорта в нужном контексте вам уже показывали.


Название: Re: PythonQt (пр-во имен)
Отправлено: sergek от Октябрь 31, 2013, 09:21
Как мне сделать класс vec видимым из пытона не заставляя пользователя писать import?
Сделать это самому:
Код:
// cpp
context->registerClass(&vec::staticMetaObject, "example", PythonQtCreateObject<vec>);
...
context.evalScript("from PythonQt.example import *");


Название: Re: PythonQt (пр-во имен)
Отправлено: Igors от Октябрь 31, 2013, 09:59
importModule пробовал, возвращает не NULL, но результат тот же. Выполнить эту строку самому через evalScript - все норм, работает, спасибо.

Если уж разговор о пр-ве имен, то такой вопрос: вот я написал в скрипте
Код:
pt = vec()
При этом переменная pt остается живой и может использоваться в др или том же скрипте (хотя инициализации pt уже нет). Как бы мне зачистить все переменные что пользователь насоздавал при предыдущем выполнении скрипта? И как при этом кое-какие переменные оставить (пригодятся) ?

Спасибо


Название: Re: PythonQt (пр-во имен)
Отправлено: sergek от Октябрь 31, 2013, 10:09
Как бы мне зачистить все переменные что пользователь насоздавал при предыдущем выполнении скрипта?
средствами Python:
Код:
>del pt


Название: Re: PythonQt (пр-во имен)
Отправлено: Igors от Октябрь 31, 2013, 10:33
средствами Python:
Код:
>del pt
А как мне узнать что есть переменнвя pt (ведь не каждую переменная мапится мной)?


Название: Re: PythonQt (пр-во имен)
Отправлено: sergek от Октябрь 31, 2013, 11:49
А как мне узнать что есть переменнвя pt (ведь не каждую переменная мапится мной)?
http://webonrails.ru/post/274/ (http://webonrails.ru/post/274/)
http://docs.python.org/2/tutorial/ (http://docs.python.org/2/tutorial/)
Еще можно использовать функцию расширения Python, основанную на PythonQt::getVariable, но придется ее делать методом зарегистрированного класса и вызывать ее для какого-либо глобального объекта.
К сожалению, PythonQt не предоставляет возможности регистрации обычных C-функций (а в API Python такая возможность есть).


Название: Re: PythonQt (пр-во имен)
Отправлено: Igors от Октябрь 31, 2013, 21:40
http://webonrails.ru/post/274/ (http://webonrails.ru/post/274/)
http://docs.python.org/2/tutorial/ (http://docs.python.org/2/tutorial/)
Намек понял, спасибо, изучаю. Но тут др проблема - как тормознуть скрипт? Вот допустим во время передачи значения из скрипта в приложение  - отлуп (так нельзя). Как мне испустить exception (или по-другоиу) но сказать скрипту "нет, свободен" ?

Прошу прощения за сумбурность вопросов - но проект есть проект. Спасибо за понимание


Название: Re: PythonQt (пр-во имен)
Отправлено: sergek от Ноябрь 01, 2013, 09:28
Но тут др проблема - как тормознуть скрипт? Вот допустим во время передачи значения из скрипта в приложение  - отлуп (так нельзя). Как мне испустить exception (или по-другоиу) но сказать скрипту "нет, свободен" ?
"Ну, барин, ты задачи ставишь!" (с) М.Захаров.
хз. Выполнение скрипта можно прекратить нажатием Ctrl+C. Может, добавить функцию расширения, которая будет эмулировать нажатие этих клавиш?


Название: Re: PythonQt (пр-во имен)
Отправлено: Igors от Ноябрь 02, 2013, 12:03
С прерыванием все оказалось довольно просто - нужно выбросить std exception, напр
Код
C++ (Qt)
throw std::runtime_error("Stop!");
 
Вызов слота (а все происходит в слотах) обрамлен try/catch

С удалением переменных пока сделал так
Код
C++ (Qt)
bool CPyBase::AdjustDict( void )
{
PyObject * object = PythonQt::self()->getMainModule();
PyObject * dict = PyModule_GetDict(object);
if (!dict) return false;
 
if (!PyDict_Check(dict)) return false;
 
PyObject * keys = PyDict_Keys(dict);
if (!keys) return false;
 
bool doSave = mVarNames.size() == 0;
QStringList doomed;
int count = PyList_Size(keys);
for (int i = 0; i < count; ++i) {
PyObject * key = PyList_GetItem(keys, i);
QString name = PyString_AsString(key);
Py_DECREF(key);
if (doSave)
mVarNames.insert(name);
else
if (!mVarNames.contains(name) && !mCustomGlobals.contains(name))
doomed.push_back(name);
}
 
for (int i = 0; i < doomed.size(); ++i)
PythonQt::self()->removeVariable(object, doomed[i]);
 
return true;
}
 
Должен быть (по смыслу) и др вариант - при выполнении каждого скрипта заводить новый модуль пытона, а по окончании его удалять. Однако так я должен делать импорт всех необходимых модулей (math и др) всякий раз - не накладно ли? Также возможность использовать в одном скрипте переменные другого - может оказаться необходимым. Как считают более опытные товарищи?

Спасибо