![](/img/trans.png)
[英]How to move from a QTableWidget to the next widget using the tab-key
[英]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 字符 ?
相關但未答復和出軌:
類似於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.