Многоплатформенная команда QProcess

Мне нужно запустить какой-нибудь скрипт, используя QProcess.

Для этого под windows я использую QProcess::execute("cmd [...]");,

Тем не менее, это не будет работать, если я пойду под какой-нибудь другой ОС, такой как Linux.

Итак, мне было интересно, если лучшее решение для того, чтобы сделать этот код переносимым, — это вмешаться в решение для создания сценариев с несколькими платформами, например TCL, например.

Поэтому я использую: QProcess:execute("tclsh text.tcl"); и это работает.

Но у меня есть три вопроса, касающихся этой проблемы. Потому что я не уверен, что я сделал.

  • Будет execute() выполнять tclsh с файлом test.tcl как под Windows, так и под Linux, где бы я его не выполнял? Вроде бы так, но я хочу быть уверенным! Есть ли плохой сценарий, который может случиться?
  • Это хорошее решение? Я знаю, что у многих людей больше опыта, чем у меня, и я был бы благодарен за все, что я мог бы выучить!
  • Почему бы не использовать std::system() ? Это менее портативный?

4

Решение

Хотя это не полный ответ, я могу указать на несколько вещей.

Особенно, tclsh вполне доволен под виндой; это основная поддерживаемая платформа. Основная проблема, которая может возникнуть на практике, заключается в том, что вы передаете имя файла с пробелом в нем (это явно более вероятно в Windows, чем в Unix из-за различий в практике сообщества). Тем не менее execute() как ты это написал не имеет проблем. Ну пока tclsh расположен на PATH,

Другой основной вариант интеграции исполнения сценария Tcl с Qt — связать вашу программу с двоичной библиотекой Tcl и использовать ее. API Tcl нацелен на C, поэтому он должен быть довольно простым в использовании из C ++ (если немного неуклюже с точки зрения C ++):

// This holds the description of the API
#include "tcl.h"
// Initialize the Tcl library; *call only once*
Tcl_FindExecutable(NULL);

// Make an evaluation context
Tcl_Interp *interp = Tcl_CreateInterp();

// Execute a script loaded from a file (or whatever)
int resultCode = Tcl_Eval(interp, "source test.tcl");

// Check if an error happened and print the error if it did
if (resultCode == TCL_ERROR) {
std::cerr << "ERROR: " << Tcl_GetString(Tcl_GetObjResult(interp)) << std::endl;
}

// Squelch the evaluation context
Tcl_DeleteInterp(interp);

Я не особенно хороший C ++ кодер, но это должно дать идею. Я понятия не имею о QProcess::execute() против std::system(),

3

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

Слабым местом вашего решения является то, что на окнах вам придется установить tclsh, Здесь нет tclsh на солярисе тоже нет. Может быть где-то еще.

По сравнению с std::system(), QProcess дает вам больше контроля и информации о процессе выполнения вашей команды. Если все, что вам нужно, это просто выполнить скрипт (например, без получения выходных данных) — std::system() хороший выбор

Что я использовал в похожей ситуации:

#ifdef Q_OS_WIN
mCommand = QString("cmd /C %1 %2").arg(command).arg(args);
#else
mCommand = QString("bash %1 %2").arg(command).arg(args);
#endif
1

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