1

引数のスマートな補完を提供するために readline を使用する単純なシェルのようなプログラムを作成しました。スペースを含み、1 つの引数として示すために引用符で囲まれた引数をサポートするメカニズムが必要です (シェルにそのようなものを提供する場合と同様)。

shlex.split() が引用符で囲まれた引数を解析する方法を知っていることを見てきましたが、ユーザーが入力の途中で完了したい場合は失敗します (たとえば、「complete "Hello 」は、shlex に渡されたときに例外がスローされます)。 、引用符のバランスが取れていないため)。

これを行うためのコードはありますか?

ありがとう!

4

3 に答える 3

2

タスクの既存のコードについては知りませんが、これを行う場合は例外をキャッチし、偽の末尾の引用符を追加して、変更された文字列で shlex.split がどのように機能するかを確認します。

于 2009-08-07T17:11:43.963 に答える
1

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、コンピューターにプレーンがありませんでした)、環境に合わせて調整する必要がある場合があります。

また、私の場合、それが私のユースケースだったので、補完機能の特別なものとして二重引用符のみを設定しました。

参考文献

于 2018-12-03T02:34:33.213 に答える
0

@caxcaxcoatl の回答をもう少しポータブルにするために、ハードコードされた readline バージョンを次のように置き換えることができreadline.__file__ます。

import ctypes
import readline

libreadline = ctypes.CDLL (readline.__file__)
rl_completer_quote_characters = ctypes.c_char_p.in_dll (
    libreadline, 
    "rl_completer_quote_characters"
)
rl_completer_quote_characters.value = '"'
于 2021-04-16T03:34:32.683 に答える