4

我正在用 watchman-make 编写一个 watchman 命令,但在尝试准确访问目录中更改的内容时我不知所措。我想运行我的 upload.py 脚本并在脚本中访问 /var/spool/cups-pdf/ANONYMOUS 中新创建的文件的文件名。到目前为止我有

$ watchman-make -p '/var/spool/cups-pdf/ANONYMOUS' -—run 'python /home/pi/upload.py'

我想在 python upload.py 中添加另一个参数,这样我就可以有一个新创建的文件的确切文件路径,以便我可以将新文件发送到我在 upload.py 中的数据库,

我一直在看守望者的文档,我能想到的最接近的东西是触发器对象。请帮忙!

4

2 回答 2

3

解决方案watchman-wait

假设项目布局如下:

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh

像这样的shell脚本:

#!/bin/bash
# File: convert.sh

SrcDirPath=$(cd "$(dirname "$0")/../"; pwd)
cd "$SrcDirPath"

echo "Converting: $SrcDirPath/$1"

然后我们可以watchman-wait这样启动:

watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done

当我们更改文件时/posts/_SUBDIR_WITH_POST_NAME_/index.md,输出将是这样的:

...
Converting: /Users/.../Angular/dartweb_quickstart/posts/swift-on-android-building-toolchain/index.md
Converting: /Users/.../Angular/dartweb_quickstart/posts/swift-on-android-building-toolchain/index.md
...
于 2020-02-11T23:44:24.877 回答
0

watchman-make旨在与工具一起使用,这些工​​具将执行他们自己的后续查询,以发现他们下一步想要做什么。例如,运行该make工具将使stat各个部门的 make 更新。

这意味着upload.py如果您想将它与 watchman 一起使用,您的脚本需要知道如何为自己执行此操作。

您有几个选择,具体取决于您希望事情变得多么复杂:

使用 pywatchman 发出临时查询

如果您希望能够upload.py随时随地运行并让它找出正确的事情(就像make会做的那样),那么您可以让它直接询问守望者。您可以upload.py使用pywatchman(python watchman 客户端)来执行此操作。 pywatchman如果 watchmanconfigure脚本认为你有一个工作的 python 安装,将被安装。你也可以pip install pywatchman。一旦你有它可用并在你的PYTHONPATH

import pywatchman

client = pywatchman.client()
client.query('watch-project', os.getcwd())
result = client.query('query', os.getcwd(), {
   "since": "n:pi_upload",
   "fields": ["name"]})
print(result["files"])

此代码段使用带有命名游标的since 生成器来发现自上次使用相同命名游标发出查询以来发生更改的文件列表。Watchman 会为您记住相关的时钟值,因此您无需通过状态跟踪使脚本复杂化。我们使用光标的名称;该名称在可能使用命名游标的守望者客户端中必须是唯一的,因此在您的工具之后命名它是避免潜在冲突的好主意。pi_upload

这可能是提取所需信息的最直接方法,无需您对上传脚本进行更具侵入性的更改。

使用 pywatchman 启动长时间运行的订阅

这种方法将转换您的upload.py脚本,使其知道如何直接订阅守望者,因此watchman-make您无需直接运行upload.py,而是继续运行并执行上传。这有点侵入性,并且代码太多,无法尝试粘贴到此处。如果您对这种方法感兴趣,那么我建议您将后面的代码watchman-wait作为起点。你可以在这里找到它:

https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait

您可能想要修改的关键部分是这一行:

https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait#L169

这是它接收文件列表的地方。

为什么不触发?

您可以为此使用触发器,但我们正在引导人们远离触发器,因为它们难以管理。触发器将在后台运行,并将其输出发送到 watchman 日志文件。很难判断它是在运行还是停止运行。

该界面更接近 unix 模型,并允许您在标准输入上提供文件列表。

说到unix,那watchman-wait呢?

我们还有一个命令可以在更改文件时发出更改文件的列表。watchman-wait您可能会从upload.py. 这将使它与订阅方法有一些相似之处,但无需直接使用 pywatchman 客户端。

于 2017-10-25T04:14:42.033 回答