Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to launch an EDITOR (e. g. vim) from a python script?

I want to call up an editor in a python script to solicit input from the user, much like crontab e or git commit does.

Here's a snippet from what I have running so far. (In the future, I might use $EDITOR instead of vim so that folks can customize to their liking.)

tmp_file = '/tmp/up.'+''.join(random.choice(string.ascii_uppercase + string.digits) for x in range(6)) edit_call = [ "vim",tmp_file] edit = subprocess.Popen(edit_call,stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True )    

My problem is that by using Popen, it seems to keep my i/o with the python script from going into the running copy of vim, and I can't find a way to just pass the i/o through to vim. I get the following error.

Vim: Warning: Output is not to a terminal Vim: Warning: Input is not from a terminal 

What's the best way to call a CLI program from python, hand control over to it, and then pass it back once you're finished with it?

like image 653
sam Avatar asked Jun 10 '11 16:06

sam


People also ask

How do I open vi editor in Python?

Save the text data you intend to be modified to a temporary file, open the editor (vi) as an external process pointing to that file, using os. system - or subprocess. Popen if you need more control over it, and read the temporary file back.

What is vim in Python?

Vim (source code), short for Vi IMproved, is a configurable text editor often used as a Python development environment. Vim proponents commonly cite the numerous plugins, Vimscript and logical command language as major Vim strengths.

How do I run code in vim?

A simple method would be to type : while in normal mode, and then press the up arrow key on the keyboard and press Enter. This will repeat the last typed commands on VIM.

How do I create a Python file in vim?

Write Your Python Script To write in the vim editor, press i to switch to insert mode. Write the best python script in the world. Press esc to leave the editing mode. Write the command :wq to save and quite the vim editor ( w for write and q for quit ).


1 Answers

Calling up $EDITOR is easy. I've written this kind of code to call up editor:

import sys, tempfile, os from subprocess import call  EDITOR = os.environ.get('EDITOR','vim') #that easy!  initial_message = "" # if you want to set up the file somehow  with tempfile.NamedTemporaryFile(suffix=".tmp") as tf:   tf.write(initial_message)   tf.flush()   call([EDITOR, tf.name])    # do the parsing with `tf` using regular File operations.   # for instance:   tf.seek(0)   edited_message = tf.read() 

The good thing here is, the libraries handle creating and removing the temporary file.

like image 89
mike3996 Avatar answered Oct 04 '22 18:10

mike3996