Ruf einen EDITOR (vim) aus einem Python-Skript auf

Ich möchte einen Redakteur in einem Python-Skript aufrufen, um die Eingabe von dem Benutzer zu erbitten, ähnlich wie crontab e oder git commit tut.

Hier ist ein Ausschnitt von dem, was ich bisher laufen kann. (In der Zukunft könnte ich $ EDITOR anstelle von vim verwenden, damit die Leute nach ihrem Geschmack anpassen können.)

 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 ) 

Mein Problem ist, dass mit Popen, scheint es, meine I / O mit dem Python-Skript von gehen in die laufende Kopie von vim zu halten, und ich kann nicht finden, einen Weg, um nur passieren die i / o bis zu vim. Ich bekomme den folgenden Fehler.

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

Was ist der beste Weg, um ein CLI-Programm von Python, Hand Kontrolle über es zu nennen, und dann übergeben Sie es zurück, sobald Sie damit fertig sind?

3 Solutions collect form web for “Ruf einen EDITOR (vim) aus einem Python-Skript auf”

Aufruf von $ EDITOR ist einfach. Ich habe diese Art von Code geschrieben, um den Redakteur aufzurufen:

 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() 

Die gute Sache hier ist, die Bibliotheken behandeln das Erstellen und Entfernen der temporären Datei.

Die PIPE ist das Problem. VIM ist eine Anwendung, die davon abhängt, dass die Stdin / Stdout-Kanäle Terminals sind und nicht Dateien oder Rohre. Das Entfernen der stdin / stdout paramters hat für mich gearbeitet

Ich würde vermeiden, os.system zu verwenden, da es durch das Unterprozessmodul ersetzt werden sollte .

In python3: 'str' does not support the buffer interface

 $ python3 editor.py Traceback (most recent call last): File "editor.py", line 9, in <module> tf.write(initial_message) File "/usr/lib/python3.4/tempfile.py", line 399, in func_wrapper return func(*args, **kwargs) TypeError: 'str' does not support the buffer interface 

Für python3 verwenden Sie initial_message = b"" , um den gepufferten String zu deklarieren.

Verwenden edited_message.decode("utf-8") dann edited_message.decode("utf-8") , um den Puffer in einen String zu dekodieren.

 import sys, tempfile, os from subprocess import call EDITOR = os.environ.get('EDITOR','vim') #that easy! initial_message = b"" # 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() print (edited_message.decode("utf-8")) 

Ergebnis:

 $ python3 editor.py look a string 
  • Kompilieren vim mit spezifischer Version von Python
  • Python mit Gvim ausführen
  • Verwenden von cscope, um Python-Code mit VIM zu durchsuchen?
  • Hervorhebung unerreichter Klammern in vim
  • Libpython-Fehler beim Aufbau von YouCompleteMe
  • Schwierigkeiten bei der Verwendung von Vim's syn-include und syn-region, um die Syntax-Hervorhebung einzubetten
  • Kompilieren vim mit pythonunterstützung auf Ubuntu
  • So senden Sie den Status an die VIM-Statuszeile, nachdem Sie die benutzerdefinierte VIM-Funktion (Python) aufgerufen haben
  • Vim und PEP 8 - Style Guide für Python Code
  • "Google" Python-Stil Skript funktioniert nicht
  • Sortierung nach Name in vim
  • Python ist die beste Programmiersprache der Welt.