我从用户那里获取命令和参数,解析它们并将它们传递给os.execvp()
,像这样:
> ps -a -u -x
cmd = "ps"
args = ["-a", "-u", "-x"]
os.execvp(cmd, args)
问题是这不适用于管道或重定向,因此这样的方法不起作用:
> ps -a -u -x > output.txt
cmd = ps
args = ["-a", "-u", "-x", ">", "output.txt"]
os.execvp(cmd, args)
我明白我的问题是>
and output.txt
不是以下参数ps
,我只是不知道解决这个问题的最佳方法。我希望我只是缺少正确的方法。
With os.execv
我们处于操作系统的低级别。
要重定向输出,我们需要替换文件描述符 no。 1 (stdout) 在执行命令之前。
import os
STDOUT = 1
fdout = os.open('output.txt', os.O_WRONLY)
os.dup2(fdout, STDOUT)
os.execvp('ps', 'ps -a -u -x'.split())
# not reached
os._exit(127) # just for the case of execv failure
使用管道连接两个进程需要更多工作。管道有两端,必须首先创建。然后fork
将重复该过程。每个进程必须关闭管道的一端,并将另一端分别重定向到其 stdin 或 stdout。
import os
STDIN = 0
STDOUT = 1
pipein, pipeout = os.pipe()
if os.fork():
# parent
os.close(pipeout)
os.dup2(pipein, STDIN)
os.execlp('wc', '-l')
# not reached
os._exit(127)
else:
# child
os.close(pipein)
os.dup2(pipeout, STDOUT)
os.execvp('ps', 'ps -a -u -x'.split())
# not reached
os._exit(127)
这些只是概念的示例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)