为什么Gradle任务阻止执行生成进程的Python脚本?

时间:2015-01-28 19:25:13

标签: python gradle build.gradle gradlew

我在Gradle任务中运行Python脚本时遇到了问题。

短版

为什么执行Python脚本的Gradle任务(Python脚本会产生进程)似乎会阻塞?

长版

背景资料

我创建了三个Python脚本。

  • start.py:生成两个进程,当脚本退出时不会终止
  • stop.py:杀死两个衍生进程
  • test.py:是否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突然完成。

我的问题

我需要在单独的任务中使用startstop。所以我的问题是:

  1. 我的build.gradle文件中的内容看起来是否正确?
  2. 为什么Gradle在执行生成进程的Python脚本时会阻塞?
  3. 如何在Python脚本生成进程后“取消阻止”gradle start任务?

1 个答案:

答案 0 :(得分:1)

  1. build.gradle文件的内容看起来正确。所有任务都是正确定义的。

  2. 因为如果任务的类型为Exec,它会等到进程完成,然后任务也完成。如果从Exec任务运行python脚本启动了两个单独的进程,并且它们以某种方式有界到启动它们的脚本( bounded 到gradle任务本身)它必须完成以允许gradle任务完成。例如,请查看this问题。

  3. 通过编写将在后台启动进程的自定义任务。请参阅上面链接的问题。

  4. 希望这会有所帮助。如果有任何不清楚的地方,请问。