2

我遇到了从 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存在之前, Iprint("Exiting...")显示在控制台上。所以我知道 Python 脚本已执行并完成。

在另一个终端中,我执行gradle stop,它成功终止了进程。

这是奇怪的部分。gradle stop命令成功完成后gradle start,之前被阻塞的 ,突然完成。

我的问题

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

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

1 回答 1

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

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

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

希望这可以帮助。如果有什么不清楚的,就问吧。

于 2015-01-29T07:52:23.507 回答