Pythonのreadlineを使用した引用符付き行の処理
質問
引数をスマートに補完するために readline を使用する、単純なシェルのようなプログラムを作成しました。スペースを含み、1 つの引数として示すために引用符で囲まれた引数をサポートするメカニズムが必要です (シェルにそのような引数を提供する場合と同様)。
shlex.split() は引用符で囲まれた引数を解析する方法を知っていますが、ユーザーが入力途中で完了したい場合は失敗します (例:'complete "Hello ' は、引用符のバランスが取れていないため、shlex に渡されるときに例外がスローされます)。
これを行うためのコードはありますか?
ありがとう!
解決
私は仕事のための既存のコードを知らないが、私はこれを行うにした場合、私は、例外をキャッチし、偽の末尾に引用符を追加してみてください、とshlex.splitは、このように変更された文字列でない方法を参照してくださいね。
他のヒント
GNU Readline では、変数を使用してそのようなシナリオが可能です rl_completer_quote_characters
. 。残念ながら、Python は標準ライブラリのそのオプションをエクスポートしません。 readline
モジュール (この記事の執筆時点では最新である 3.7.1 でも)。
私はそれを行う方法を見つけました ctypes
, 、 けれど:
import ctypes
libreadline = ctypes.CDLL ("libreadline.so.6")
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
libreadline,
"rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'
これは明らかに移植性がないことに注意してください(libreadlineのバージョンはハードコードされているため、おそらくLinuxディストリビューション間でさえも可能ですが、私はプレーンなバージョンを持っていませんでした) libreadline.so
私のコンピュータでは)そのため、環境に合わせて調整する必要があるかもしれません。
また、私の場合は、それが私のユースケースであったため、補完機能の特別なものとして二重引用符のみを設定しました。
参考文献