Мне нужно запустить какой-нибудь скрипт, используя QProcess.
Для этого под windows я использую QProcess::execute("cmd [...]");
,
Тем не менее, это не будет работать, если я пойду под какой-нибудь другой ОС, такой как Linux.
Итак, мне было интересно, если лучшее решение для того, чтобы сделать этот код переносимым, — это вмешаться в решение для создания сценариев с несколькими платформами, например TCL, например.
Поэтому я использую: QProcess:execute("tclsh text.tcl");
и это работает.
Но у меня есть три вопроса, касающихся этой проблемы. Потому что я не уверен, что я сделал.
execute()
выполнять tclsh
с файлом test.tcl
как под Windows, так и под Linux, где бы я его не выполнял? Вроде бы так, но я хочу быть уверенным! Есть ли плохой сценарий, который может случиться?std::system()
? Это менее портативный?Хотя это не полный ответ, я могу указать на несколько вещей.
Особенно, 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()
,
Слабым местом вашего решения является то, что на окнах вам придется установить 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