Python встроен в c. Вызывает ли PyRun_SimpleString синхронный?

люди.
Я был бы признателен, если бы вы могли мне помочь.
Целью приложения является перевод лемм слов, присутствующих в предложении, с русского на английский. Я делаю это с помощью словаря в формате sdict, который запрашивается скриптом python, который вызывается программой c ++.

Моя цель — получить следующий вывод:

Выставка / выставка :: 1 конгресс / конгресс :: 2 организаторами / организатор :: 3 которой / которые :: 4 являются / появляются :: 5 РАО / НЕТ :: 6 ЕЭС / НЕТ :: 7 России / НЕТ :: 8 EESR /НИКТО:: 9 нефтяная / Нефть :: 10 компания / компания :: 11 ЮКОС / НЕТ :: 12 ЮКОС / НЕТ :: 13 и / и :: 14 администрация / администрация :: 15 Томской / НЕТ :: 16 область / регион :: 17 продлится / последний :: 18 четыре / четыре :: 19 дня / день :: 20

Следующий код завершился успешно для предложения, однако для второго предложения и т. Д. Я получил неправильный вывод:

Егор /НИКТО:: 1 Гайдар / НЕТ :: 2 руководителя / НЕТ :: 3 первое / руководитель :: 4 российское / первое :: 5 правительство / НЕТ :: 6 которое / правительство :: 7 называло / которое :: 8 правительства / вызов :: 9 камикадзе / правительство :: 10

Замечания: NONE используется для слов без перевода.

Я запускаю следующий фрагмент кода C ++, который на самом деле вызывает PyRun_SimpleString:

for (unsigned int i = 0; i < theSentenceRows->size(); i++){

stringstream ss;
ss << (i + 1);
parsedFormattedOutput << theSentenceRows->at(i)[FORMINDEX] << "/";
getline(lemmaOutFileForTranslation, lemma);

PyObject *main_module, *main_dict;
PyObject *toTranslate_obj, *translation, *emptyString;
/* Setup the __main__ module for us to use */
main_module = PyImport_ImportModule("__main__");
main_dict   = PyModule_GetDict(main_module);

/* Inject a variable into __main__, in this case toTranslate */
toTranslate_obj = PyString_FromString(lemma.c_str());
PyDict_SetItemString(main_dict, "start_word", toTranslate_obj);

/* Run the code snippet above in the current environment */
PyRun_SimpleString(pycode);
**usleep(2);**
translation = PyDict_GetItemString(main_dict, "translation");
Py_XDECREF(toTranslate_obj);

/* writing results */
parsedFormattedOutput << PyString_AsString(translation) << "::" << ss.str() << " ";

Где pycode определяется как:

const char *pycode =
"import sys\n""import re\n""import sdictviewer.formats.dct.sdict as sdict\n""import sdictviewer.dictutil\n""dictionary = sdict.SDictionary( 'rus_eng_full2.dct' )\n""dictionary.load()\n""translation = \"*NONE*\"\n""p = re.compile('( )([a-z]+)(.*?)( )')\n""for item in dictionary.get_word_list_iter(start_word):\n""        try:\n""            if start_word == str(item):\n""                instance, definition = item.read_articles()[0]\n""                translation = p.findall(definition)[0][1]\n""        except:\n""            continue\n";

Я заметил некоторую задержку в выводе второго предложения, поэтому я добавил usleep (2); на C ++, думая, что это происходит потому, что вызов PyRun_SimpleString не синхронно. Это не помогло, однако, и я не уверен, что это причина. Ошибка задержки происходит для предложений, которые следуют и увеличиваются.

Итак, это призыв к PyRun_SimpleString синхронное? Может быть, разделение значений переменных между C ++ и Python не правильно?
Заранее спасибо.

2

Решение

В соответствии с документы, это синхронно.

Я бы посоветовал вам тестировать код Python отдельно от кода C ++, что значительно упростит его отладку. Один из способов сделать это — вставить код в интерактивный интерпретатор и выполнить его построчно. И при отладке я бы поддержал комментарий Уинстона Эверта, чтобы не отбрасывать исключения.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]