2012-04-12 41 views
4

我想复制当你做'git commit'之类的事情时发生的功能。它打开你的编辑器,然后键入一些东西,然后保存/退出,将该文件交给启动编辑器的脚本。从Python中打开vi

我该如何在Python中实现这个功能?

编辑:

感谢您的建议,这里的基础上,答案工作示例:

import os, subprocess, tempfile 

(fd, path) = tempfile.mkstemp() 
fp = os.fdopen(fd, 'w') 
fp.write('default') 
fp.close() 

editor = os.getenv('EDITOR', 'vi') 
print(editor, path) 
subprocess.call('%s %s' % (editor, path), shell=True) 

with open(path, 'r') as f: 
    print(f.read()) 

os.unlink(path) 

回答

4

常见的情况其他建议是:

  1. 创建一个临时文件,它
  2. 启动存储在环境变量“编辑器”命令写默认内容。这通常是一个shell命令,所以它可能包含参数 - >运行thourgh壳或一旦这个过程结束据此分析它
  3. ,读回临时文件
  4. 删除临时文件

因此,像这个:

import os, subprocess, tempfile 
f, fname = tempfile.mkstemp() 
f.write('default') 
f.close() 
cmd = os.environ.get('EDITOR', 'vi') + ' ' + fname 
subprocess.call(cmd, shell=True) 
with open(fname, 'r') as f: 
    #read file 
os.unlink(fname) 
+0

您可能需要检查subprocess.call的返回码以确保用户没有终止进程。 'returncode = subprocess.call(cmd,shell = True)'然后检查它是否为== 0 – 2014-04-16 11:02:01

+0

我得到'AttributeError:'int'对象没有属性'write''在行'f.write('default' )'。更好地使用'tempfile.mkstemp'似乎就在那里:https://www.logilab.org/blogentry/17873 – 2016-07-19 12:48:46

0
os.system("\bin\vi %s"%filename) 

ftxt = open(filename,"r").read() 
0

实现这一点的一种方法是使用子进程。该代码看起来像这样:

import subprocess 
subprocess.call(['vi', 'filename.txt']) 

从这将返回给出vi的返回状态。

1

将要修改的文本数据保存到临时文件中,使用os.system - 或subprocess.Popen打开编辑器(vi)作为指向该文件的外部进程,如果需要对其进行更多的控制,并读回临时文件。

我建议你默认打开vi,但要尊重“VISUAL”环境变量的内容。

import os 

name = os.tmpnam() 
editor = "vi" if not ["VISUAL"] in os.environ else os.environ["VISUAL"] 
os.system("%s %s" % (editor, name)) 
data = open(name).read() 
os.unlink(name)