我在Gradle任务中运行Python脚本时遇到了问题。
为什么执行Python脚本的Gradle任务(Python脚本会产生进程)似乎会阻塞?
我创建了三个Python脚本。
print("Done")
(此脚本用于调试目的。)从终端/控制台本地运行所有三个Python脚本会执行预期的行为。
我有一个Gradle任务,对于每个Python脚本,任务调用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
。所以我的问题是:
gradle start
任务?答案 0 :(得分:1)
build.gradle文件的内容看起来正确。所有任务都是正确定义的。
因为如果任务的类型为Exec
,它会等到进程完成,然后任务也完成。如果从Exec
任务运行python脚本启动了两个单独的进程,并且它们以某种方式有界到启动它们的脚本( bounded 到gradle任务本身)它必须完成以允许gradle任务完成。例如,请查看this问题。
通过编写将在后台启动进程的自定义任务。请参阅上面链接的问题。
希望这会有所帮助。如果有任何不清楚的地方,请问。