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.py
exists, I . print("Exiting...")
これで、Python スクリプトが実行されて完了したことがわかりました。
別のターミナルで を実行するgradle stop
と、プロセスが正常に終了します。
ここが奇妙な部分です。gradle stop
コマンドが正常に完了すると、gradle start
以前はブロックされていた が突然完了します。
私の質問
start
とstop
を別々のタスクにする必要があります。だから私の質問は:
- build.gradle ファイルの内容は正しいですか?
- プロセスを生成する Python スクリプトを実行すると、Gradle がブロックされるのはなぜですか?
gradle start
Python スクリプトがプロセスを生成した後、タスクの「ブロックを解除」するにはどうすればよいですか?