我试图仅通过使用'cat < hello.txt | cat | cat > hello2.txt'
在python中复制os.pipe()
。我不是想花哨的东西,只是为了教育。
我真的对如何做到这一点感到困惑。但我正在考虑如下操作:
所以我列出了要在管道之间执行的所有命令的列表-
pipe_commands = [['/bin/cat < hello.txt'] , ['/bin/cat'], ['/bin/cat > hello2']]
for i in pipe_command:
r, w = os.pipe()
if '<' in i:
pid = os.fork()
if pid == 0:
os.close(r)
w = os.fdopen(w, 'w') # Start Writting on write end of pipe
os.dup2(w.fileno(), sys.stdout.fileno())
f= open('hello.txt', 'r') # start reading from hello.txt
os.dup2(f.fileno(), sys.stdin.fileno())
os.execl('/bin/echo', 'echo')
else:
os.wait()
os.close(w)
r = os.fdopen(r, 'r')
os.dup2(r.fileno(), sys.stdin.fileno()) # read from read end of pipe
# OUTPUT TO BE GIVEN TO NEXT COMMAND
elif '>' in i:
pid = os.fork()
if pid == 0:
os.close(w) # Start reading from previous commands pipe output
r = os.fdopen(r, 'r')
os.dup2(r.fileno(), sys.stdin.fileno())
f = open('hello2.txt', 'w') # write to hello2.txt
os.dup2(f.fileno(), sys.stdout.fileno())
os.execl('/bin/echo', 'echo')
else:
os.wait()
else:
pid = os.fork()
if pid == 0:
os.close(r)
w = os.fdopen(w, 'w') # Start Writting on write end of pipe
os.dup2(w.fileno(), sys.stdout.fileno())
os.execl('/bin/echo', 'echo') #input from read end of the previous command
else:
os.wait()
os.close(w)
r = os.fdopen(r, 'r')
os.dup2(r.fileno(), sys.stdin.fileno()) # read from read end of pipe
# OUTPUT TO BE GIVEN TO NEXT COMMAND
此后,我感到困惑,我是谁使它成为下一个从输出中读取'/bin/cat'
以执行第一个管道(cat < hello.txt | cat
)的命令?
关于如何将其循环以使其自动化的任何提示? (我知道我使用的for循环是错误的)
我知道这不是执行管道的最佳解决方案,但是我们仅受过os.pipe()
的教导,并且避免使用os.system
和os.subprocess
。
预先感谢
答案 0 :(得分:1)
您似乎在朝着正确的方向前进。
基本思想是,需要用管道替换stdin,stdout和/或stderr,以便进程之间可以相互通信。由于您会多次这样做,因此拥有一个功能是很好的。
例如
def start_process(command, newin, newout, newerr):
pid = os.fork()
if pid == 0:
# Child process
os.dup2(newin, 0) # Replace stdin
os.dup2(newout, 1) # Replace stdout
os.dup2(newerr, 2) # Replace stderr
os.execv(command, (command,))
else:
# Parent process
return pid
一旦有了该功能,就可以开始考虑如何运行命令。我将把循环留给您,但这类似于以下内容。
# cat < hello.txt
# stdin=hello.txt, stdout=pipe1, stderr=unchanged
hello = open('hello.txt', 'r')
pipe1_read, pipe1_write = os.pipe()
proc1 = start_process('/bin/cat', hello.fileno(), pipe1_write, sys.stderr.fileno())
os.close(pipe1_write) # only proc1 should have this
# /bin/cat
# stdin=pipe1 stdout=pipe2, stderr=unchanged
pipe2_read, pipe2_write = os.pipe()
proc2 = start_process('/bin/cat', pipe1_read, pipe2_write, sys.stderr.fileno())
os.close(pipe2_write) # only proc2 should have this
# etc...
开始所有过程后,只需等待它们完成即可。
os.waitpid(proc1, 0)
os.waitpid(proc2, 0)
os.waitpid(proc3, 0)