2

Gradle タスクから Python スクリプトを実行すると問題が発生しました。

短縮版

Python スクリプトがプロセスを生成する Python スクリプトを実行する Gradle タスクがブロックされているように見えるのはなぜですか?

ロングバージョン

背景情報

3 つの Python スクリプトを作成しました。

  • start.py: スクリプトが終了しても終了しない 2 つのプロセスを生成します。
  • stop.py: 生成された 2 つのプロセスを強制終了します。
  • test.py: print("Done")(このスクリプトはデバッグ目的で使用されました。)

ターミナル/コンソールからローカルで 3 つの Python スクリプトをすべて実行すると、期待どおりの動作が実行されます。

Python スクリプトごとに、タスクが Python スクリプトを呼び出す Gradle タスクがあります。私のbuild.gradleは次のようになります:

task start (type:Exec) {
    workingDir './mysie'
    commandLine 'python', 'start.py'
}

task stop(type:Exec) {
    workingDir './mydir'
    commandLine 'python', 'stop.py'
}

task testPython(type:Exec) {
    workingDir './mydir'
    commandLine 'python', 'test.py'
}

私が解決しようとしている問題

Gradle ラッパー実行可能ファイルを使用しています。実行するgradlew testPythonと、タスクが実行され、BUILD SUCCESSFULメッセージが表示されます。

$ /gradlew test
Parallel execution is an incubating feature.
:testPython
Done

BUILD SUCCESSFUL

Total time: 0.888 secs

したがって、これは がgradlewブロックせずに Python スクリプトを正常に実行できることを示しています。ただし、 を実行するgradlew startと、2 つのプロセスが生成されます。Python スクリプトが 2 つのプロセスを生成するのではなく、それらを終了しないことが重要です。Gradle タスクが完了しません。ブロックされているようです。これが私が見る出力です:

$ gradlew start
Parallel execution is an incubating feature.
:start
<Insert Python "print" statement that have been flushed here>
> Building 0% > :start

ホストで開始されたプロセスを確認できます。また、コンソールに表示されるbefore start.pyexists, I . print("Exiting...")これで、Python スクリプトが実行されて完了したことがわかりました。

別のターミナルで を実行するgradle stopと、プロセスが正常に終了します。

ここが奇妙な部分です。gradle stopコマンドが正常に完了すると、gradle start以前はブロックされていた が突然完了します。

私の質問

startstopを別々のタスクにする必要があります。だから私の質問は:

  1. build.gradle ファイルの内容は正しいですか?
  2. プロセスを生成する Python スクリプトを実行すると、Gradle がブロックされるのはなぜですか?
  3. gradle startPython スクリプトがプロセスを生成した後、タスクの「ブロックを解除」するにはどうすればよいですか?
4

1 に答える 1

1
  1. build.gradle ファイルの内容は正しいようです。すべてのタスクが正しく定義されています。

  2. タスクがタイプのExec場合、プロセスが終了するまで待機するため、タスクも終了します。Execタスクから実行されている python スクリプトから 2 つの別個のプロセスが開始され、それらを開始したスクリプト (gradle タスク自体にバインドされている)にバインドされている場合、gradle タスクも終了できるようにすべてを終了する必要があります。たとえば、この質問を見てください。

  3. バックグラウンドでプロセスを開始するカスタム タスクを作成する。上記のリンクの質問を参照してください。

お役に立てれば。不明な点があれば、質問してください。

于 2015-01-29T07:52:23.507 に答える