Python 使用Watchman';s watch使我想访问更改文件的名称

Python 使用Watchman';s watch使我想访问更改文件的名称,python,watchman,Python,Watchman,我正在用watchmanmake编写一个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中添加另一个参数,这样我就可以

我正在用watchmanmake编写一个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中的数据库


我一直在看watchman的文档,我认为最接近使用的是触发器对象。请帮忙

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

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

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

使用pywatchman发出临时查询 如果您想随时运行
upload.py
,并让它找到正确的方法(就像
make
那样),那么您可以让它直接询问watchman。您可以让
upload.py
使用
pywatchman
(python watchman客户端)来执行此操作<如果watchman
configure
脚本认为您的python安装工作正常,则会安装code>pywatchman。您还可以
pip安装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"])
此代码段使用带命名游标的自生成器来发现自上次使用同一命名游标发出查询以来更改的文件列表。Watchman将为您记住相关的时钟值,因此您不需要使用状态跟踪使脚本复杂化。我们使用名称
pi_upload
作为光标;在可能使用命名游标的watchman客户机中,名称必须是唯一的,因此以您的工具命名是避免潜在冲突的好主意

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

使用pywatchman启动长时间运行的订阅 此方法将转换您的
upload.py
脚本,以便它知道如何直接订阅watchman,因此您只需直接运行
upload.py
,它将继续运行并执行上载,而不是使用
watchman make
。这是一个有点侵入性的,并且有点太多的代码,无法尝试粘贴到这里。如果您对这种方法感兴趣,那么我建议您将
watchman wait
后面的代码作为起点。你可以在这里找到它:

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

这是它接收文件列表的位置

为什么不触发? 你可以使用触发器,但我们正在引导人们远离触发器,因为它们很难管理。触发器将在后台运行,并将其输出转到watchman日志文件。很难判断它是否正在运行,也很难阻止它运行

该界面更接近unix模型,并允许您在stdin上提供文件列表

说到unix,watchman wait怎么样?
我们还有一个命令,它在文件更改时发出更改文件列表。您可以在
upload.py
中对
watchman wait
的输出进行流式传输。这将使其与订阅方法有一些相似之处,但不直接使用pywatchman客户端。

解决方案与
watchman wait

假设项目布局如下:

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh
#!/bin/bash
# File: convert.sh

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

echo "Converting: $SrcDirPath/$1"
watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done
...
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
...
shell脚本如下所示:

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh
#!/bin/bash
# File: convert.sh

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

echo "Converting: $SrcDirPath/$1"
watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done
...
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
...
然后我们可以像这样启动
watchman wait

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh
#!/bin/bash
# File: convert.sh

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

echo "Converting: $SrcDirPath/$1"
watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done
...
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
...
当我们用POST\u NAME\uu/index.md更改文件
/posts/\u SUBDIR\u时,输出如下:

/posts/_SUBDIR_WITH_POST_NAME_/index.md
/Scripts/convert.sh
#!/bin/bash
# File: convert.sh

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

echo "Converting: $SrcDirPath/$1"
watchman-wait . --max-events 0 -p 'posts/**/*.md' | while read line; do ./Scripts/convert.sh $line; done
...
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
...

感谢您的详细回复!最后,我创建了另一个名为.archive的目录,在脚本中,我检查了监视目录的内容,然后将其上载到数据库,然后将内容移动到归档目录,以便下次我列出内容时,只有新文件才能完成此过程。到目前为止,这一切都很有魅力!