web-dev-qa-db-ja.com

pythonスクリプトからEDITOR(vim)を呼び出す

pythonスクリプトでエディターを呼び出して、crontab eまたはgit commitが行うように、ユーザーからの入力を要求します。

これは私がこれまでに実行したものからの抜粋です。 (将来、人々が好みに合わせてカスタマイズできるように、vimの代わりに$ EDITORを使用する可能性があります。)

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 )   

私の問題は、Popenを使用することで、pythonスクリプトを使用したI/Oがvimの実行中のコピーに入らないようにすることであり、単に渡す方法を見つけることができないi/o through vim。次のエラーが発生します。

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

PythonからCLIプログラムを呼び出し、それに制御を渡して、使い終わったらそれを渡すための最良の方法は何ですか?

43
sam

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

ここでの良い点は、ライブラリが一時ファイルの作成と削除を処理することです。

73
nperson325681

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
_

Python3の場合、_initial_message = b""_を使用してバッファリングされた文字列を宣言します。

次に、edited_message.decode("utf-8")を使用して、バッファを文字列にデコードします。

_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"))
_

結果:

_$ python3 editor.py
look a string
_
6
modle13

パッケージ python-editor

$ pip install python-editor
$ python
>>> import editor
>>> result = editor.edit(contents="text to put in editor\n")

詳細はこちら: https://github.com/fmoo/python-editor

5
Mathieu Longtin

PIPEが問題です。 VIMは、stdin/stdoutチャネルがターミナルであり、ファイルやパイプではないという事実に依存するアプリケーションです。stdin/ stdoutパラメータを削除すると、うまくいきました。

私はos.systemを使用しないようにします すべき サブプロセスモジュールに置き換えられます。

3
dmeister

clickはコマンドライン処理に最適なライブラリであり、いくつかのユーティリティを備えています。click.edit()は移植性があり、EDITOR環境変数を使用します。 stuffという行をエディターに入力しました。文字列として返されることに注意してください。いいね。

(venv) /tmp/editor $ export EDITOR='=mvim -f'
(venv) /tmp/editor $ python
>>> import click
>>> click.edit()
'stuff\n'

ドキュメントをチェックしてください https://click.palletsprojects.com/en/7.x/utils/#launching-editors 私の全体的な経験:

/tmp $ mkdir editor
/tmp $ cd editor
/tmp/editor $ python3 -m venv venv
/tmp/editor $ source venv/bin/activate
(venv) /tmp/editor $ pip install click
Collecting click
  Using cached https://files.pythonhosted.org/packages/fa/37/45185cb5abbc30d7257104c434fe0b07e5a195a6847506c074527aa599ec/Click-7.0-py2.py3-none-any.whl
Installing collected packages: click
Successfully installed click-7.0
You are using pip version 19.0.3, however version 19.3.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(venv) /tmp/editor $ export EDITOR='=mvim -f'
(venv) /tmp/editor $ python
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 16:52:21)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import click
>>> click.edit()
'stuff\n'
>>>
0
Powell Quiring