栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Python-如何使用subprocess.Popen通过管道连接多个进程?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python-如何使用subprocess.Popen通过管道连接多个进程?

您将对以下内容感到满意。

import subprocessawk_sort = subprocess.Popen( "awk -f script.awk | sort > outfile.txt",    stdin=subprocess.PIPE, shell=True )awk_sort.communicate( b"input datan" )

将部分工作委托给外壳。让它通过管道连接两个进程。

您将更高兴地将

“ script.awk”
重写为Python,从而消除了awk和管道。

编辑。提示

awk
没有帮助的一些原因。

[有太多原因需要通过评论做出回应。]

Awk正在添加没有重大价值的步骤。awk的处理过程没有Python无法处理的独特之处。

对于大量数据,从awk到排序的流水线操作可能会缩短处理时间。对于短数据集,它没有明显的好处。快速测量

awk >file
;
sort file并awk | sort
揭示并发性会有所帮助。使用sort时,它很少有帮助,因为
sort
不是一次性过滤器。

“ Python进行排序”处理(而不是“

Python
进行
awk
进行排序”)的简单性避免了在此处询问确切类型的问题。

Python虽然比

awk
更为冗长,但也很明显,其中
awk
具有某些对新手来说是不透明的隐式规则,这会使非专业人士感到困惑。

Awk(类似于

shell
脚本本身)添加了
Another Another Programming
语言。如果所有这些都可以用一种语言(
Python
)来完成,则无需使用shell,而awk编程可以消除两种编程语言,从而使人们可以专注于任务的价值创造部分。

底线:awk不能增加可观的价值。在这种情况下,awk是净成本;它增加了足够的复杂性,因此有必要提出这个问题。删除awk将获得净收益。

补充工具栏为什么构建管道

(a | b)
如此困难。

遇到外壳时

a | b
,必须执行以下操作。

分叉原始外壳的子进程。最终将成为b。

建立一个

OS
管道。(不是
Python subprocess.PIPE
),但调用os.pipe()返回两个通过公共缓冲区连接的新文件描述符。此时,该进程具有来自其父级的
stdin,stdout,stderr
,外加一个文件
“ a's stdout”
“ b's stdin”

分叉一个孩子。子代将其标准输出替换为新的a的标准输出。执行该a过程。

b
子关闭,用新b的
stdin
替换其
stdin
。执行该b过程。

b
子等待
a
完成。

父级正在等待

b
完成。

我认为上面的代码可以递归生成

a | b | c
,但是您必须隐式地括住长管道,将它们视为
a | (b | c)

由于Python有

os.pipe(),os.exec()
并且
os.fork()
,你可以替换
sys.stdin
sys.stdout
,有一种方法做上述纯Python。确实,您可以使用
os.pipe()
和确定一些快捷方式
subprocess.Popen

但是,将该操作委托给Shell会更容易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/386311.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号