用Watchman编译python文件

用Watchman编译python文件,python,compilation,watchman,Python,Compilation,Watchman,从watchman获取要传递的文件/路径信息的最佳方式是什么 “制作”或其他应用程序 以下是我试图实现的目标: 在dev服务器上保存.py文件时,我希望检索文件名和路径,将py编译为pyc,然后将pyc文件传输到临时服务器 我是否应该使用watchman make、“heredoc”方法、ansible等。? 因为这些文档非常有用,所以有没有可用的示例 那么,pywatchman的用例是什么 提前感谢希望这将有助于澄清一些事情: Watchman作为每用户服务运行,以监视您的文件系统。它可以:

从watchman获取要传递的文件/路径信息的最佳方式是什么 “制作”或其他应用程序

以下是我试图实现的目标:

在dev服务器上保存.py文件时,我希望检索文件名和路径,将py编译为pyc,然后将pyc文件传输到临时服务器

我是否应该使用watchman make、“heredoc”方法、ansible等。? 因为这些文档非常有用,所以有没有可用的示例

那么,pywatchman的用例是什么


提前感谢

希望这将有助于澄清一些事情:

Watchman作为每用户服务运行,以监视您的文件系统。它可以:

  • 提供文件更改发生时的实时订阅
  • 当文件发生更改时,触发要在后台运行的命令
  • 回答有关自给定时间点以来文件如何更改的问题
  • pywatchman是一个python客户机实现,它允许您构建使用watchman信息的应用程序。
    watchman make
    watchman wait
    工具使用pywatchman实现

    watchman make
    是一种工具,当文件更改时,它可以帮助您调用
    make
    (或类似程序)。在您想要运行的程序不需要刚刚更改的特定文件列表的情况下,这是最合适的<代码>制造属于此类别
    make
    将分析
    Makefile
    中的依赖项,然后仅构建更改的部分。您也可以执行python distutils或setuptools
    setup.py
    脚本

    本机watchman触发器比watchman make更难使用,因为它们是由watchman服务在后台生成的,并被传递到已更改的文件列表中。这些最适合于完全无人参与的流程,在这些流程中,您不需要查看输出,也不需要更改文件的精确列表

    根据您所描述的,听起来最简单的解决方案是执行编译步骤然后执行同步的脚本,如下所示:;我们称之为
    buildandsync.sh

    #!/bin/sh
    python -m compileall .
    rsync -avz . host:/path/
    
    (如果您实际上不需要
    .pyc
    文件,只需要同步,那么您可以从上面的脚本中删除
    python
    行,让它运行
    rsync

    然后,当情况发生变化时,您可以使用
    watchman make
    执行此操作:

    watchman-make --make='build-and-sync.sh' -p '**/*.py' -t dummy
    
    然后,在更改任何
    .py
    文件(或一组
    .py
    文件)后,
    watchman make
    将执行
    build-and-sync.sh dummy
    。这应该足够了,除非您有足够多的python文件,以至于每次进行更改时编译步骤花费的时间太长
    watchman make
    将一直运行,直到您按下CTRL-C或以其他方式终止进程;它在终端窗口的前台运行,除非您使用类似于
    nohup
    tmux
    screen
    的东西使其保持更长时间

    如果是这种情况,那么您可以尝试使用带有模式规则的
    make
    来仅编译更改的python文件,或者如果使用make来表达这一点很难,那么使用
    pywatchman
    来建立订阅并编译更改的文件可能是值得的。这是一个更高级的用例,我建议查看的代码,看看如何实现。除非您有大量文件或非常紧迫的同步时间限制,否则可能不值得为此付出额外的努力

    我建议先尝试最简单的解决方案,看看是否满足您的需求,然后再尝试更复杂的选项

    使用本机触发器 作为替代,您可以使用触发器。它们在后台运行,其输出将进入watchman日志文件。与使用
    watchmanmake
    相比,使用它们要困难一些

    您需要编写一个小程序,通常是一个脚本,以从触发器接收已更改文件的列表;最好的方法是通过脚本的stdin。您可以每行接收一个文件列表,或者接收一个包含更多结构化信息的JSON对象。让我们调用这个脚本
    触发构建和同步
    ;由您来实现脚本的内容。假设您只需要stdin上的文件列表

    此命令将设置触发器;您调用它一次,它将一直保持到手表被移除:

    watchman -j <<-EOT
    ["trigger", "/path/to/root", {
       "name": "build-and-sync",
       "expression": ["suffix", "py"],
       "command": "/path/to/trigger-build-and-sync",
       "append_files": false,
       "stdin": "NAME_PER_LINE"
    }]
    EOT
    

    watchman-j为什么您想要一个.pyc而不仅仅是使用.py文件?我建议您阅读:然后决定您是否真的需要.pyc。“…这些最适合于完全无人参与的流程,您不需要查看输出,也不需要更改文件的精确列表”触发器是无人参与流程所需的,但如何检索watchman提供的文件名/路径列表?感谢您的快速回复Watchman将向您传递一个JSON对象,其中包含触发器程序stdin上的文件列表。您需要使用,并在触发器定义中将
    stdin
    属性设置为
    [“name”]
    “……我建议先尝试最简单的解决方案,看看是否满足您的需要,然后再尝试更复杂的选项之一。”文档使其变得复杂。我所看到的只是“heredoc”的例子。所以基本上,我创建了一个.watchmanconfig文件,向其中添加扩展的json触发器语法,等等。您提到“.在程序的stdin上”,建议我创建某种脚本/应用程序,将stdin作为命令读取到触发器定义中?我还查看了看守等待命令。我更接近于一个解决方案,但它似乎不是递归的。为什么?谢谢我已经扩展了上面的答案,包含了更多关于触发器的细节。手表绝对是递归的。上面我举的例子是关于usin的