我正在尝试在vim中创建和编辑临时文件(与git / hg / svn中的提交脚本完全相同)。
我在这个答案中找到了一个方法: call up an EDITOR (vim) from a python script
import sys, tempfile, os
from subprocess import call
EDITOR = os.environ.get('EDITOR','vim')
initial_message = "write message here:"
with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
tmp.write(initial_message)
tmp.flush()
call([EDITOR, tmp.name])
tmp.seek(0)
print tmp.read()
当我运行上面的代码时,tempfile不会读取在vim中所做的更改。这是之后的输出我在vim中添加了几行:
fgimenez@dn0a22805f> ./note.py
Please edit the file:
fgimenez@dn0a22805f>
现在有趣(奇怪)的部分。如果我将编辑器更改为nano或emacs,则脚本可以正常工作!到目前为止,当我使用vim或textedit时,这似乎只会中断。
作为另一个实验,我尝试连续调用几个编辑器来查看会发生什么。修改后的代码是:
with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
tmp.write(initial_message)
tmp.flush()
# CALLING TWO EDITORS HERE, VIM THEN NANO
call(['vim', tmp.name])
raw_input("pausing between editors, just press enter")
call(['nano', tmp.name])
tmp.seek(0)
print tmp.read()
即。我用vim然后nano编辑。会发生什么是nano DOES注册vim所做的更改,但是python没有注册任何内容(与之前相同的结果):
fgimenez@dn0a22805f> ./note.py
Please edit the file:
fgimenez@dn0a22805f>
但是,如果我先用nano编辑,那么vim,python仍会注册纳米编辑而不是vim的编辑!
with tempfile.NamedTemporaryFile(suffix=".tmp") as tmp:
tmp.write(initial_message)
tmp.flush()
# CALLING TWO EDITORS HERE, NANO THEN VIM
call(['nano', tmp.name])
raw_input("pausing between editors, just press enter")
call(['vim', tmp.name])
tmp.seek(0)
print tmp.read()
运行程序并在nano中添加a\nb\nc
并在vim中添加d\ne\nf
输出:
fgimenez@dn0a22805f> ./note.py
Please edit the file:
a
b
c
fgimenez@dn0a22805f>
似乎使用vim或textedit消除了附加到文件的能力。我在这里完全糊涂了,我只想在vim中编辑我的笔记......
我在osx Mavericks上
我从shell(不是MacVim)调用vim并以ZZ结束会话(也尝试过:w:q)
答案 0 :(得分:2)
我不是Python专家,但看起来你在Vim编辑文件的同时保持打开临时文件的句柄,然后尝试从句柄读入编辑过的内容。默认情况下,Vim会创建原始文件的副本,将新内容写入另一个文件,然后将其重命名为原始文件(有关详细信息,请参阅:help 'backupcopy'
;其他像nano这样的编辑器显然不这样做)。这意味着Python句柄仍然指向原始文件(即使它可能已经从文件系统中删除,具体取决于Vim设置),并且您获得了原始内容。
您需要重新配置Vim(请参阅:help 'writebackup'
),或者(更好)更改Python实现以在Vim退出后重新打开相同的临时文件名,以便获取新写入的句柄文件内容。
答案 1 :(得分:2)
在我的代码在Linux上正常工作后,我在OS X上遇到了同样的问题。正如Ingo建议的那样,您可以通过重新打开文件来获取最新内容。为此,您可能希望使用delete=False
创建一个临时文件,然后在完成后明确删除该文件:
import sys, tempfile, os
from subprocess import call
EDITOR = os.environ.get('EDITOR','vim')
initial_message = "write message here:"
with tempfile.NamedTemporaryFile(suffix=".tmp", delete=False) as tmp:
tmp.write(initial_message)
tmp.flush()
call([EDITOR, tmp.name])
tmp.close()
with open(tmp.name) as f:
print f.read()
os.unlink(tmp.name)