保存时自动运行python代码

Posted

技术标签:

【中文标题】保存时自动运行python代码【英文标题】:Automatically run python code on save 【发布时间】:2013-10-05 23:22:46 【问题描述】:

有没有办法在每次保存时自动观看 python 脚本文件并在 tmux/screen 中执行它?我主要在 vim 中工作,每次我想评估它在新窗口中打开的代码时,它都会破坏工作流程。我问这个是因为我也在 Scala 中工作,并且 sbt 构建工具有非常好的选择来做到这一点(在保存时运行编译器/REPL)

【问题讨论】:

如果你在 vim 中工作,为什么不为 save 函数写一个别名呢?比如代替 :w 你做 :pyw (python 保存),然后在保存时运行代码?同样在 VIM 中它不应该打开一个新窗口,至少它不会在我的开发机器上。 您是否在screen 窗口中运行vim,并希望在父screen 内的新窗口中运行Python 脚本? 我使用名为 ScreenShell 的插件,它在 vim 旁边运行一个 tmux 窗口,所有这些都在全局 tmux 实例中。它只是在其中创建一个拆分窗口。 我喜欢 ctrl-z 让编辑器在后台运行,然后手动运行。 How can I automatically evaluate a script and put the results into an existing window after saving in Vim? 的可能重复项 【参考方案1】:

如果每次我保存一个 py 文件,它都会自动执行,那会很烦人。由于您可以编辑 py 文件,因此只需 py 类。或者纯配置的东西。无论如何,如果您希望发生这种情况,您可以尝试:

autocmd FileWritePost *.py exec '!python' shellescape(@%, 1)

我的vimrc 中的内容是:

autocmd FileType python call AutoCmd_python()

fun! AutoCmd_python()
        "setlocal other options for python, then:
    nnoremap <buffer> <F9> :exec '!python' shellescape(@%, 1)<cr>

endf

现在您可以手动&lt;F9&gt; 来测试您当前的python 文件。

【讨论】:

【参考方案2】:

按照肖恩和肯特的建议,最简单的方法是让vim 驱动它。

但是,如果您只“主要”在 vim 中工作,那可能不合适。

唯一的另一种选择是编写使用您平台的文件系统监视 API 的代码,或者,如果最糟糕的情况出现,定期轮询文件,并在每次更新时运行它。然后只需在您的screentmux 下运行该代码(可能在另一个screen 窗口中使用vim)。

由于我不了解您的平台,我将编写一个愚蠢的轮询实现来展示这个想法 - 请记住,在现实生活中,使用像 inotifywatch/fswatch 这样的工具会更好/等:

import os
import subprocess
import sys
import time

scripts = sys.argv[1:]
mtimes = script: os.stat(script).st_mtime for script in scripts
while True:
    for script in scripts:
        mtime = os.stat(script).st_mtime
        if mtime != mtimes[script]:
            subprocess.call([script], shell=True)
            mtimes[script] = mtime
    time.sleep(250)

现在,你可以这样做了:

$ screen
$ python watch.py myscript.py
$ ^AS^A<Tab>^A^C
$ vim myscript.py

【讨论】:

我主要在 linux 上工作,而 fswatch 正是我想要的。非常感谢您的帮助 @deprofundis:等等,Linux 上有一个叫fswatch 的东西?我什至不知道……我建议为 OS X 使用 fswatch,为 linux 建议 inotifywatch(或者可能像 gaminlibfam 端口之类的包装器,我忘记了它的名称,希望有工具在每个平台上都一样)。但是,如果有一个 linux fswatch,并且它可以满足您的需求……好吧,即使我偶然得到它,我也会接受。 :) 我的意思是 inotifywatch , fswatch 只能在 Mac 上使用,抱歉。

以上是关于保存时自动运行python代码的主要内容,如果未能解决你的问题,请参考以下文章

测试人员如何使用Python代码把自动化测试的数据保存下来进行操作呢?

python自动运行.exe文件并保存结果

python怎么保存代码 python写好的代码如何保存

Python啥情况下会生成pyc文件

请问我在spyder上可以直接运行程序,为啥保存为python程序后一运行就自动弹出

如何自动触发 Python 代码?