命令行脚本,用于在文件更改时重新运行指定的命令。
项目描述
在大多数情况下,该项目已被 https://github.com/tartley/rerun2 取代,这是一个十行Bash脚本,使用inotify而不是轮询,并优雅地处理包含shell别名等的命令。但是rerun2:* 不会在Linuxland之外工作。* 在VM的挂载上无法看到文件系统事件。* 不接受任何命令行参数来修改行为。因此,这个原始的“rerun”仍然有其用途。
安装
pip install rerun
用法
rerun [--help|-h] [--verbose|-v] [--ignore|-i=<file>] [--version] <command>
位置
<command> Command to execute as a single arg, i.e. put it inside double quotes, or else spaces and other special characters should be escaped. --help|-h Show this help message and exit. --ignore|-i=<file> File or directory to ignore. Any directories of the given name (and their subdirs) are excluded from the search for changed files. Any modification to files of the given name are ignored. The given value is compared to basenames, so for example, "--ignore=def" will skip the contents of directory "./abc/def/" and will ignore file "./ghi/def". Can be specified multiple times. --interactive, -I Run the command in an interactive shell. This allows the use of shell aliases and functions, but is slower, less reliable and noisier on stdout/stderr, because it sources ~/.bashrc and the like before running the command. Not available on Windows. --verbose|-v Display the names of changed files before the command output. --version Show version number and exit.
示例
rerun --verbose --ignore=myoutputdir "python -m unittest mymodule"
这将在您在当前目录或其子目录中保存源代码时运行您的测试,但不会在.pyo文件由于执行测试而更新时再次重新运行测试,也不会在我们程序写入myoutputdir时。
这对于在编辑器中按下“保存”后在另一个控制台窗口中查看新的测试结果很有用,而无需更改窗口焦点。
描述
重跑通过每秒检查一次文件修改时间来检测文件变化。它在当前目录及其所有子目录中查找。一旦检测到任何变化,它就会清除终端并重新运行给定的命令。
它始终忽略名为 .svn、.git、.hg、.bzr、build 和 dist 的目录。可以使用 –ignore 选项添加到这个列表中。
它始终忽略以 .pyc 或 .pyo 结尾的文件。这目前不能被用户覆盖。
虽然轮询看起来不是最优的,但我还没有遇到过 rerun 的资源使用量大到足以引起注意的项目。(另外,请参阅下文关于“watchdog”的讨论。)
依赖关系
在 MacOSX、Ubuntu、WindowsXP、Windows 7 上进行了测试。
在 Python 2.6、2.7 和 3.4 上进行了测试。
使用“pip”安装还会安装所有其他所需的 Python 包。(参见 setup.py 的“install_requires”)
黑客开发
要安装开发依赖
在 Python 2.6 上
pip install -r requirements_dev_2.6.txt
在 Python 的较新版本上
pip install -r requirements_dev.txt
这些也会安装运行时依赖(即 requirements.txt,它只是引用 setup.py 中的“install_requires”字段),因此您只需安装一个 requirements 文件。
要运行测试
make test
请参阅 Makefile 的内容,了解我在开发 rerun 时使用的其他常用命令的速查表。
待办事项
在屏幕顶部打印时间戳,以便用户可以看到命令上次运行的时间。
让用户按下一个键强制重跑。
这应该只是分解成一个等待文件系统事件并退出的命令吗?从 shell 中调用“命令”可能比从“rerun”内部调用它容易得多。然后“rerun”可以简单地写成 Bash 函数。其他 Bash 函数可以使用相同的模式在等待按键(或睡眠以轮询)后迭代。
已知问题
请参阅 https://github.com/tartley/rerun/issues 中的问题。
替代方案
PyPI 包“watchdog”是一个跨平台的库,用于处理文件系统事件,包括脚本“watchmedo”,它看起来是“Rerun”的一个更严肃和强大的版本。
https://pypi.python.org/pypi/watchdog
然而,我无法让 watchmedo 为我的主要用例工作,即当 Vim 保存文件时重新运行测试。这是由于 Vim 以原子方式将临时文件写入并移动到覆盖数据的方式。因此,Vim 保证用户永远不会丢失数据,但同时也未能生成 watchmedo 所寻找的正确 FS 事件。
感谢
非常感谢 StackOverflow 用户“rici”,他解释了如何使用交互式 shell 解释给定命令中的 shell 别名和函数,然后解释了如何在一旦 shell 终止就检索丢失的终端。 http://stackoverflow.com/questions/25099895/from-python-start-a-shell-that-can-interpret-functions-and-aliases
感谢 Bitbucket 用户 sgourley 报告、跟进甚至提出修复问题 #1,即在忽略目录方面的一个严重错误,在我最终发现错误之前。谢谢你的推动!
这个想法来自 Bash 命令“watch”,而这个实现的灵感来自 Jeff Winkler 的一篇旧博客文章,他的网站 http://jeffwinkler.net 现在似乎已经关闭。
更改
- 1.0.28
将 .cache(pytest)和‘node_modules’添加到默认忽略目录中。
- 1.0.27
删除了版本,我在 PyPI 上传时搞错了。
- 1.0.26
防止在监视的文件被删除时崩溃。
- 1.0.25
文档调整。
- 1.0.24
上一个版本在 Windows 上破坏了 rerun。现在已修复。(我们开始使用的用于标识用户默认 shell 的模块“pwd”在 Windows 上不存在。)因此,“-I”或“–interactive”在 Windows 上将不起作用,但可能在那里区分常规 shell 和交互式 shell 的区别是没有意义的。
- 1.0.23
现在使用非交互式shell运行给定命令已成为默认行为。每次运行命令都需要源码.bashrc和类似文件,因此速度较慢,标准输出噪声较大,且易于出错。例如,virtualenvwrapper经常无法正确初始化,并生成大量关于此的错误输出。当需要时(即要运行的命令包含shell别名或函数时),可以使用‘–interactive’或‘-I’请求交互式shell。
- 1.0.22
不再在当前工作目录下存在损坏的符号链接时崩溃。
- 1.0.21
在交互式shell中运行用户指定的命令,以便正确解释shell别名和函数。
- 1.0.20
(自迁移到github以来的第一个版本)修复了在Python 3下运行的问题,特别是针对3.4进行了测试。
- 1.0.19
现在期望命令是单个参数(即应转义空格等,或整个命令应加引号),从而允许在复合命令(如管道)上重运行。
- 1.0.18
现在在Python 2.6上运行,并在Python 3.3上进行了测试。
联系
- 文档 & 下载:
- 源代码和问题:
- 联系作者:
Jonathan Hartley,邮箱:tartley at domain tartley.com,Twitter:@tartley。
项目详情
rerun-1.0.30.zip 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 33bf86cb3d9dcdb51c6a6712b0cefcdebd7cdffce654d6bc9c8d7aae51e500e9 |
|
MD5 | f5c56343b0172fa02bd1c837a1195139 |
|
BLAKE2b-256 | 95d9dd0334d2517b8ab0b3de0fff3e0370902c14057b47d2e15207a327a433a2 |