用Watchman编译python文件

时间:2015-11-28 22:15:43

标签: python compilation watchman

从watchman捕获文件/路径信息的最佳方法是什么? '制作'或另一个应用程序?

这就是我想要实现的目标:

当我在开发服务器上保存.py(s)文件时,我想检索文件名和路径,将py编译为pyc,然后将pyc文件传输到登台服务器。

我应该使用watchman-make,'heredoc'方法,ansible等? 因为文档非常有用,有没有可用的例子?

并且,pywatchman的用例是什么?

提前致谢

1 个答案:

答案 0 :(得分:3)

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

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

  1. 在文件发生变化时提供实时订阅
  2. 触发命令在文件发生更改时在后台运行
  3. 回答有关自给定时间点以来文件如何变化的查询
  4. pywatchman是一个python客户端实现,允许您构建使用watchman信息的应用程序。 watchman-makewatchman-wait工具是使用pywatchman实现的。

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

    本地守望者触发器比watchman-make更难使用,因为它们是由守望者服务在后台生成的,并且传递了已更改文件的列表。这些最适合完全无人值守的过程,您不需要查看输出并需要精确的已更改文件列表。

    从您所描述的内容来看,听起来最简单的解决方案是执行编译步骤然后执行同步的脚本,类似于以下内容;我们称之为build-and-sync.sh

    #!/bin/sh
    python -m compileall .
    rsync -avz . host:/path/
    

    (如果您真的不需要.pyc文件而只需要同步,那么您只需从上面的脚本中移除python行,然后让它运行{{1 }})

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

    watchman-make

    然后,在更改任何watchman-make --make='build-and-sync.sh' -p '**/*.py' -t dummy 文件(或一组.py个文件)后,.py将执行watchman-make。这应该足够了,除非你有足够多的python文件,每次进行更改时编译步骤都需要太长时间。 build-and-sync.sh dummy将继续运行,直到您按CTRL-C或以其他方式终止进程;它会在终端窗口的前台运行,除非您使用watchman-makenohuptmux之类的内容来保持更长时间。

    如果是这种情况,那么您可以尝试使用带有模式规则的screen来仅编译已更改的python文件,或者如果使用make表示难以表达,则可能值得使用{{1}建立订阅并编译已更改的文件。这是一个更高级的用例,我建议查看watchman-wait的代码,看看如何实现。https://facebook.github.io/watchman/docs/cmd/trigger.html#extended-syntax除非您有大量文件或非常严格的时间限制,否则可能不值得为此付出额外的努力。

    我建议您首先尝试最简单的解决方案,看看是否符合您的需求,然后再尝试其中一个更复杂的选项。

    使用本机触发器

    作为替代方案,您可以使用触发器。它们在后台运行,输出到watchman日志文件。与使用make相比,它们更难处理。

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

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

    watchman-make

    可以在https://codereview.stackexchange.com/questions/86016/left-shifting-an-array-of-ints

    找到完整的文档