On 22Dec2011 22:16, Tim Chase <python.l...@tim.thechases.com> wrote: | After a little searching, I've not been able to come up with what | I'd consider canonical examples of consider calling an external | editor/pager on a file and reading the results back in. (most of my | results are swamped by people asking about editors written in | Python, or what the best editors for Python code are) | | The pseudocode would be something like | | def edit_text(data): | temp_fname = generate_temp_name() | try: | f = file(temp_fname, 'w') | f.write(data) | f.close() | before = info(temp_fname) # maybe stat+checksum? | editor = find_sensible_editor() | subprocess.call([editor, temp_fname]) | if before == info(temp_fname): | return None | else: | return file(temp_fname).read() | finally: | delete_if_exists(temp_fname) | | However there are things to watch out for in this lousy code: | | -race conditions, unique naming, and permissions on the temp file
NamedTemporaryFile is your friend. | -proper & efficient detection of file-change, to know whether the | user actually did anything Wait for the editor to exit? In that scenario I go for: - wait for edit to exit - if exit status 0 and file non-empty, trust it (subject to parse issues afterwards of course) | -cross-platform determination of a sensible editor (that blocks | rather than spawns), using platform conventions like | os.environ['EDITOR'] os.environment.get('EDITOR', 'vi')? Some platforms have an executable called "editor" that solves that problem (absent $EDITOR); MacOSX has "open", though it won't be running a blocking editor, alas. You may need some knowledge of the local system. On a terminal? Easy, use $EDITOR. No terminal, but $DISPLAY? xterm -e "$EDITOR temp_file", or the like. No terminal, no $DISPLAY, macosx? I have an incantation somewhere... | -cleanup deletion of the temp-file NamedTemporaryFile is your friend. | I presume the code for spawning $PAGER on some content would look | pretty similar. Yep. | Any good example code (or blog posts, or other links) that has been | battle-tested? Hmm. Nothing directly to had, but regarding the temp file: # write contents of the file `fp` into a temp file with NamedTemporaryFile('w', dir=os.path.join(self.dir, 'tmp')) as T: T.write(fp.read()) ... do stuff with T.name (the temp file name). Anyway, look it up; it has an autodelete mode etc. Cheers, -- Cameron Simpson <c...@zip.com.au> DoD#743 http://www.cskk.ezoshosting.com/cs/ I have always been a welly man myself. They are superb in wet grass, let alone lagoons of pig shit. - Julian Macassey -- http://mail.python.org/mailman/listinfo/python-list