М
2 июля 2020 г. 1:43

Qt C++ и Python

nltk, Qt, Python, C++

Может быть Qt тут и ни при чём, тогда как это сделать в C++.
C++ учу. Python - ну слышал что такое есть, умею писать print("hello world").
Имеется огромное желание решить одну задачу.
Допустим, имеем библиотеку nltk в python и некую программу на C++.

nltk выдаёт такое:

  1. nltk.pos_tag(nltk.word_tokenize("""I love you"""))
  2. [('I', 'PRP'), ('love', 'VBP'), ('you', 'PRP')]

Как получить такой результат

С++ (Qt):

  1. QString iLoveYouQtString("I love you.")
  2. QMap<QString, QString> qtMap;

python:

  1. qtMap = nltk.pos_tag(nltk.word_tokenize(iLoveYouQtString))
  1. QMap<QString, QString>::const_iterator i = qtMap.constBegin();
  2. while (i != qtMap.constEnd()) {
  3. cout << i.key() << ": " << i.value() << Qt::endl;
  4. ++i;
  5. }

>> I: PRP
>> love: VBP
>> you: PRP

Короче говоря, как связать скрипт python и программу C++

upd. Ну я так думаю, что из Qt будет запускаться скрипт с подачей в него аргумента. Но можно ли при этом получить из этого скрипта возврат обратно в C++. И как это хоть выглядит, покажите направление, я подхвачу, наваяю что-нибудь и вы потом может быть подправите, если не получится.

2

Вам это нравится? Поделитесь в социальных сетях!

5
Evgenii Legotckoi
  • 2 июля 2020 г. 11:50

Если вы хотите использовать Qt и Python. То используйте PyQt5 (неофициальная библиотека привязок из Python к Qt) или PySide2 (официально поддерживаемая бибилотека привязок из Python к Qt).

А скрещивать ужа с ежом, чтобы получить 5 метров колючей проволоки не надо. То есть не пишите C++ программу, в которой будете вызывать Python код, который будет вызывать C++, который ... и тут мы окончательно запутываемся в этом бардаке.

Пишите на Python, используя библиотеки привязок к Qt: PyQt5 или PySide2

    М
    • 3 июля 2020 г. 16:43

    Мне казалось что это задача простая.

    Ну значит буду у вас с питоном скоро помощи просить.

      Evgenii Legotckoi
      • 3 июля 2020 г. 16:52
      • (ред.)

      Это возможно. Но обычно это используется для добавления внутренней консоли в приложение и использования скриптов, чаще JavaScript скриптов (Qt имеет JavasScript Engine), чем Python.
      При этом для внутренней логики с внутренним интерпретатором без использования внешних пакетов.
      Чтобы делать то, что вы хотите, обычно обдумывают все подводные камни раз 100.

      Можно конечно запускать отдельный Python скрипт через QProcess. но как-то совсем некомильфо, как я думаю. Лучше уж полностью использовать Python, если не предполагается интерфейс прогаммы как у CAD систем.

      Собственно, можете действтительно попробовать использовать QProcess, возможно, это как раз то, что вам нужно будет.
      Возможно, я бы только результат выполнения куда-нибудь складывал, например в текстовый файл. А по окончанию выполнения скрипта считывал бы этот файл уже в Qt программе.

        М
        • 3 июля 2020 г. 16:56

        запускать отдельный Python скрипт через QProcess

        Да, как-то так представлял. Запустил, он отработал, а что дальше непонятно. Положил данные в какой-то файл или в БД, а C++ уже обращается туда? Ну если это некрасиво, то потренируюсь с Python немного.

          Evgenii Legotckoi
          • 3 июля 2020 г. 17:00

          Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом.

          Если у вас есть скрипты Python, которые что-то выполняют и складывают результат выполнения в файл, то можно их запускать через QProcess, дожидаться выполнения скрипта. QProcess как раз имеет сигнал finished. И по этому сигналу выполнять считывание данных из файла.

            Комментарии

            Только авторизованные пользователи могут публиковать комментарии.
            Пожалуйста, авторизуйтесь или зарегистрируйтесь