簡體   English   中英

如何將Tab鍵發送到python子進程的stdin

[英]how to send tab-key to python subprocess's stdin

背景:我有一個Python子進程,該子進程連接到類似shell的應用程序,該程序使用readline庫處理輸入,並且該應用程序具有TAB完整的例程來執行命令輸入,就像bash一樣。 生成子進程,如下所示:

def get_cli_subprocess_handle():
    return subprocess.Popen(
                            '/bin/myshell',
                            shell=False,
                            stdin=subprocess.PIPE,
                            stdout=subprocess.PIPE,
                            stderr=subprocess.STDOUT,
                            )

一切正常,除了制表符完整。 每當我的Python程序將制表符'\\t'傳遞給子進程時,我在STDIN中獲得5個空格,而不是觸發readline庫的制表符完成例程。 :(

問題:我可以發送什么到子進程的STDIN來觸發子進程的制表符完成功能? 也許以另一種方式問:如果可能的話,我該如何發送TAB 密鑰而不是TAB 字符

相關但未答復和出軌:

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

類似於shell的應用程序可能會區分連接到stdin的終端和連接到stdin的管道。 許多Unix實用程序只是為了優化其緩沖(行與塊)而這樣做,而類似於shell的實用程序可能會禁用批輸入(即PIPE)上的命令完成功能,以避免意外結果。 命令完成實際上是一項交互式功能,需要終端輸入。

檢出pty模塊,並嘗試使用主/從對作為子流程的管道。

確實沒有將Tab 發送到管道的事情。 管道只能接受位字符串,並且如果制表符不起作用,則可能沒有解決方案。

有一個做類似pexpect的項目。 只看它的interact()代碼,我看不到任何明顯的東西可以使它起作用,而您的卻不起作用。 鑒於此,最可能的解釋是pexpect實際上做了一些工作以使自己看起來像偽終端。 也許您可以為此添加其代碼?

基於isedev的答案 ,我將代碼修改如下:

import os, pty

def get_cli_subprocess_handle():
    masterPTY, slaveTTY = pty.openpty()
    return masterPTY, slaveTTY, subprocess.Popen(
                                                 '/bin/myshell',
                                                 shell=False,
                                                 stdin=slaveTTY,
                                                 stdout=slaveTTY,
                                                 stderr=slaveTTY,
                                                 )

使用這個返回的元組,我能夠根據需要執行select.select([masterPTY],[],[])os.read(masterPTY, 1024) ,並且我使用非常有用的功能寫了給master-pty與pty模塊源代碼中的私有方法類似:

def write_all(masterPTY, data):
    """Successively write all of data into a file-descriptor."""
    while data:
        chars_written = os.write(masterPTY, data)
        data = data[chars_written:]
    return data

感謝所有的良好解決方案。 希望這個例子可以幫助其他人。 :)

暫無
暫無

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

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