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?
In python3:
'str' does not support the buffer interface
For python3, use
initial_message = b""
to declare the buffered string.Then use
edited_message.decode("utf-8")
to decode the buffer into a string.Result:
Package
python-editor
:More details here: https://github.com/fmoo/python-editor
Calling up $EDITOR is easy. I've written this kind of code to call up editor:
The good thing here is, the libraries handle creating and removing the temporary file.
The PIPE is the problem. VIM is an application that depends on the fact that the stdin/stdout channels are terminals and not files or pipes. Removing the stdin/stdout paramters worked for me.
I would avoid using os.system as it should be replaced by the subprocess module.