5

Qt (Linux) で Python スクリプトを実行するプロセスを実行しようとしていますが、動作させることができませんでした。これはコードです:

QProcess process;
QString scriptFile = "../../scriptPath/script.py";

QString pyCommand = "\"python " + scriptFile + 
                    " -f " + parameter1 +
                    " -t parameter2" +
                    " -v parameter3" +
                    " -e " + parameter4 + "\"";

printf("PyCommand: %s\n", qStringToStdString(pyCommand).c_str());

process.start ("bash", QStringList () << "-c" << pyCommand);

parameter1とはファイル ダイアログから取得したQStringparameter3であり (両方のパスは正しい)、parameter2parameter4はハードコードされた文字列です (念のため、これらの文字列には文字 "-" と "." が含まれています)。Functionは、 aを aqStringToStdStringに変換するために作成した関数であり、問​​題なく動作します (既に使用しています)。QStringstd::string

PyCommand はコンソールに出力され、問題なく表示されます。実際、ターミナルを開いて実行しようとすると、bash -c続いて printf 命令で取得したものが機能します。しかし、Qt アプリケーションを実行すると機能しません。

誰かがここで私を助けてくれますか? 私が行方不明の何か?

4

3 に答える 3

11

あなたのコードは、API がどのように機能するように設計されたかを無視しています。以下に示す代替手段のいずれかを使用する必要があります。インタープリターを明示的に使用pythonするかどうかは、Python スクリプトでシバンを適切に使用しているかどうかによって異なります。参考までに載せておきますが、簡単に捨てられます。ここでの問題の主なポイントではありません。

最初の代替 (QStringListベース)

QProcess process;
QString scriptFile =  QCoreApplication::applicationDirPath() + "../../scriptPath/script.py";

QStringList pythonCommandArguments = QStringList() << scriptFile
    << "-f " << parameter1 << "-t" <<  parameter2 << "-v"
    <<  parameter3 << "-e" << parameter4;

printf("PyCommand: %s\n", qStringToStdString(pythonCommandArguments.join(' ')).c_str());

process.start ("python", pythonCommandArguments);

第 2 の選択肢 (QStringベース)

QProcess process;
QString scriptFile =  QCoreApplication::applicationDirPath() + "../../scriptPath/script.py";

QString pythonCommand = "python " + scriptFile + 
                    " -f " + parameter1 +
                    " -t parameter2" +
                    " -v parameter3" +
                    " -e " + parameter4;

printf("PyCommand: %s\n", qStringToStdString(pythonCommand).c_str());

process.start (pythonCommand);

ここでは、両方の方法の適切なメソッド シグネチャを見つけることができます。

  • void QProcess::start(const QString & program, const QStringList & arguments, OpenMode mode = ReadWrite)

http://doc.qt.io/qt-5/qprocess.html#start

  • void QProcess::start(const QString & command, OpenMode mode = ReadWrite)

http://doc.qt.io/qt-5/qprocess.html#start-3

于 2013-10-04T19:15:36.990 に答える
4

QStringList()コマンドラインパラメータに使用する必要があります。

あなたがするpyCommand必要がありますQStringList

このようなもの:

QStringList pyCommand;
pyCommand << "-f" << parameter1 <<
                "-t" << parameter2 <<
                "-v" << parameter3 <<
                "-e" << parameter4;

process.start(scriptFile, pyCommand);

ドキュメントを参照してください: http://doc.qt.io/qt-5/qprocess.html#start

于 2013-10-04T15:30:20.993 に答える