【发布时间】:2015-01-28 19:25:13
【问题描述】:
我在从 Gradle 任务运行 Python 脚本时遇到问题。
短版
为什么执行 Python 脚本的 Gradle 任务(Python 脚本会生成一个进程)似乎会阻塞?
加长版
背景资料
我创建了三个 Python 脚本。
- start.py:生成两个进程,脚本退出时不会终止
- stop.py:杀死两个产生的进程
- test.py: 是否有
print("Done")(此脚本用于调试目的。)
从我的终端/控制台本地运行所有三个 Python 脚本会执行预期的行为。
我对每个 Python 脚本都有一个 Gradle 任务,该任务调用 Python 脚本。我的 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 时,会产生两个进程。重要的是不要让 Python 脚本生成两个进程,但不会终止它们。 Gradle 任务永远不会完成。它似乎被阻止了。这是我看到的输出:
$ gradlew start
Parallel execution is an incubating feature.
:start
<Insert Python "print" statement that have been flushed here>
> Building 0% > :start
我可以看到在我的主机上启动的进程。另外,在start.py 存在之前,我在控制台上显示了print("Exiting...")。所以我知道 Python 脚本执行并完成了。
在另一个终端,我执行gradle stop,成功终止进程。
这是奇怪的部分。在gradle stop命令成功完成后,之前被阻塞的gradle start突然完成。
我的问题
我需要将start 和stop 放在不同的任务中。所以我的问题是:
- 我的 build.gradle 文件中的内容看起来是否正确?
- 为什么 Gradle 在执行生成进程的 Python 脚本时会阻塞?
- 如何在 Python 脚本生成进程后“解除阻止”
gradle start任务?
【问题讨论】:
标签: python gradle build.gradle gradlew