簡體   English   中英

圍繞readline生成的python批處理觸發選項卡完成

[英]trigger tab completion for python batch process built around readline

背景:我有一個python程序,可以導入並使用readline模塊來構建自制的命令行界面。 我有第二個python程序(圍繞bottle和Web微框架構建),充當該CLI的前端。 第二個python程序打開到第一個的類似管道的接口,基本上在兩者之間來回傳遞用戶輸入和CLI輸出。

問題:在外部包裝程序(Web界面)中,每當最終用戶按下TAB鍵(或我綁定readline completer函數的任何其他鍵)時,該鍵都會插入CLI的stdin中, 而不會觸發readline completer函數。 我需要它來觸發readline的命令完成功能,這通常是在交互式CLI會話期間發生的。

可能的解決方案#1:是否有某種方法可以將TAB密鑰發送到子進程的stdin,以便批處理用法與交互用法相同?

可能的解決方案2:或者,如果有某種方法可以手動觸發整個完成過程(包括生成顯示匹配項),則可以插入並掃描特殊的文本序列,例如"<TAB_KEY_HERE>" ,從而觸發可能的完成匹配項手動顯示功能。 (我編寫了completer函數,該函數生成可能的匹配項,所以我真正需要的是訪問readline的功能以顯示可能的匹配項。)

可能的解決方案3:我想,如果我無法訪問readline的matchs-display函數,最后一個選擇是重寫readline的內置display-completion函數,因此我可以直接調用它。 :(

有更好的解決方案嗎? 對上述解決方案提出的路徑有何建議? 我被困在#1和#2上,而我試圖避免#3。

謝謝!

事實證明, 解決方案1是可行的方法。 關鍵是不要將Web套接字直接連接到CLI應用程序。 顯然,由於readline未連接到真正的PTY / TTY,因此readline退回到了一些更簡單的模式,該模式過濾掉了所有TAB。 (我可能不太記得這件事。已經形成了許多蜘蛛網。)相反,需要打開一個PTY / TTY對並將其插入CLI應用程序和Web-sockets應用程序之間,這欺騙了CLI應用程序以為它已連接到基於鍵盤的真實終端,如下所示:

import pty
masterPTY, slaveTTY = pty.openpty()
appHandle = subprocess.Popen(
    ['/bin/python', 'myapp.py'],
    shell=False,
    stdin=slaveTTY,
    stdout=slaveTTY,
    stderr=slaveTTY,
    )
...
while True
    # read output from CLI app
    output = os.read(masterPTY, 1024)
    ...
    # write output to CLI app
    while input_data:
        chars_written = os.write(masterPTY, input_data)
        input_data = input_data[chars_written:]
    ...
appHandle.terminate()
os.close(masterPTY)
os.close(slaveTTY)

有人。 :)

有關更多背景,請參見以下相關問題的答案:

https://stackoverflow.com/a/14565848/538418

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM