我有以下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
和{
好吧,我想我已经掌握了你的问题,看看你可以采取两种不同的方法。在
如果您确实想在子进程中为shell提供一个已经打开的文件描述符,那么您可以将}的调用。这将为您提供一对连接的真实文件描述符(而不是Python
cat
的Popen()
替换为对{file
对象)。写入第二个文件描述符的任何内容都可以从第一个文件描述符中读取,替换jury-riggedcat
-pipe。(虽然说“猫管”很有趣…)。如果需要双向对,也可以使用套接字对(socket.socketpair()
)来实现相同的目的。在或者,您可以通过使用命名管道(也称为FIFO)进一步简化您的生活。如果您不熟悉该工具,命名管道是位于文件系统名称空间中的单向管道。
os.mkfifo()
函数将在文件系统上创建管道。然后,可以在主进程中打开管道进行读取,并打开管道以从shell子进程向其写入/直接输出。这将简化代码并打开使用现有库(如Pexpect)与shell交互的选项。在相关问题 更多 >
编程相关推荐