【发布时间】:2010-09-22 12:11:56
【问题描述】:
我有以下 python 代码:
import pty
import subprocess
os=subprocess.os
from subprocess import PIPE
import time
import resource
pipe=subprocess.Popen(["cat"], stdin=PIPE, stdout=PIPE, stderr=PIPE, \
close_fds=True)
skip=[f.fileno() for f in (pipe.stdin, pipe.stdout, pipe.stderr)]
pid, child_fd = pty.fork()
if(pid==0):
max_fd=resource.getrlimit(resource.RLIMIT_NOFILE)[0]
fd=3
while fd<max_fd:
if(fd not in skip):
try:
os.close(fd)
except OSError:
pass
fd+=1
enviroment=os.environ.copy()
enviroment.update({"FD": str(pipe.stdin.fileno())})
os.execvpe("zsh", ["-i", "-s"], enviroment)
else:
os.write(child_fd, "echo a >&$FD\n")
time.sleep(1)
print pipe.stdout.read(2)
我怎样才能重写它,使它不会使用Popen 和cat?我需要一种方法从在交互式 shell 中运行的 shell 函数传递数据,该方法不会与其他函数创建的数据混合(因此我不能使用 stdout 或 stderr)。
【问题讨论】:
-
为什么不能直接
subprocess.Popen()shell? -
@llasram 因为我需要一个交互式 shell 来捕获传递给完成内置
compadd的参数。没有 tty - 没有交互 - 没有完成。 -
我不太了解...你能提供一个具体的例子吗?
-
@llasram 什么例子?如果我有一个交互式 shell,我可以使用 tab 来完成。当我按下 tab zsh 调用一些能够找到建议的 shell 函数。这些函数使用
compadd内置函数将找到的建议传递给 zsh 补全系统。但是有一些问题: 1、zsh在没有连接到tty时拒绝交互。 2. 完成函数可能会向 stderr 回显某些内容,而 zsh 本身会向 stdout 回显。在这段代码中捕获compadd参数,我可以定义compadd函数,将它们通过管道传递给给定的FD,然后使用os.write(child_fd, "echo /\t")。
标签: python ipc zsh file-descriptor