2012-04-12 11 views
4

Ich möchte die Funktionalität replizieren, die passiert, wenn Sie etwas wie "git commit" tun. Es öffnet Ihren Editor und Sie tippen etwas ein und speichern/beenden, um diese Datei an das Skript zurück zu senden, das den Editor gestartet hat.Öffnen von vi aus Python

Wie würde ich diese Funktionalität in Python implementieren?

EDIT:

Danke für die Vorschläge, hier ist ein funktionierendes Beispiel auf der Antwort basiert:

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) 

Antwort

4

Der üblicher Fall ist:

  1. eine temporäre Datei erstellen, schreibt Standardinhalt, um es
  2. Starten Sie den Befehl in der Umgebungsvariablen „Editor“ gespeichert. Dies ist normalerweise ein Shell-Befehl, so dass es Argumente enthalten könnten -> es thourgh der Shell ausgeführt oder es entsprechend
  3. analysieren Sobald der Prozess beendet, zurückgelesen temporäre Datei
  4. entfernen temporäre Datei

So etwas wie dies:

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

Sie können den Rückgabecode der Subprocess.call überprüfen, um sicherzustellen, dass der Benutzer den Prozess nicht beendet hat. 'returncode = subprocess.call (cmd, shell = True)' gefolgt von der Überprüfung, ob es == 0 ist –

+0

Ich bekomme 'AttributeError: 'int' Objekt hat kein Attribut 'write'' in Zeile' f.write (' default ') '. Eine bessere Verwendung von 'tempfile.mkstemp' scheint dort zu sein: https://www.logilab.org/bloggentry/17873 –

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

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

ipython Installieren und Blick auf dem %ed Befehl. Siehe auch andere Vorschläge in this similar question

0

Eine Möglichkeit, dies zu implementieren, ist die Verwendung von Subprozess. Der Code sieht ungefähr so ​​aus:

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

Die Rückkehr von diesem gibt den Rückkehrstatus von vi.

1

Speichern Sie die Textdaten, die in eine temporäre Datei geändert werden sollen, öffnen Sie den Editor (vi) als externen Prozess, der auf diese Datei verweist. Verwenden Sie os.system - oder subprocess.Popen, wenn Sie mehr Kontrolle darüber benötigen. und lies die temporäre Datei zurück.

Ich rate Ihnen, vi standardmäßig zu öffnen, aber den Inhalt der Umgebungsvariablen "VISUAL" zu respektieren.