如何使用Python subprocess
模块执行以下shell命令?
echo "input data" | awk -f script.awk | sort > outfile.txt
输入数据将来自字符串,因此我实际上并不需要echo。我已经走了这么远,还有谁能解释我也可以通过它进行管道传输sort吗?
p_awk = subprocess.Popen(["awk","-f","script.awk"],
stdin=subprocess.PIPE,
stdout=file("outfile.txt", "w"))
p_awk.communicate( "input data" )
更新:请注意,尽管下面接受的答案实际上并没有回答所提出的问题,但我相信S.Lott是正确的,最好避免首先解决该问题!
您将对以下内容感到满意。
import subprocess
awk_sort = subprocess.Popen( "awk -f script.awk | sort > outfile.txt",
stdin=subprocess.PIPE, shell=True )
awk_sort.communicate( b"input data\n" )
将部分工作委托给外壳。让它通过管道连接两个进程。
您将更高兴地将“ 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会更容易。
问题内容: 我有点想了解解决这个简单问题的python方法是什么。 我的问题很简单。如果使用以下代码,它将挂起。子流程模块doc中对此进行了详细记录。 搜索一个解决方案(有一个非常有见地的线程,但是我现在已经迷失了),我发现这个解决方案(以及其他)使用了一个显式的fork: 尽管此解决方案在概念上非常容易理解,但它使用了一个以上的进程,并且与子进程模块相比,其停留在太低的级别(那只是为了隐藏此类事
本文向大家介绍go语言通过管道连接两个命令行进程的方法,包括了go语言通过管道连接两个命令行进程的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言通过管道连接两个命令行进程的方法。分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的Go语言程序设计有所帮助。
问题内容: 我想在以下行上使用子流程: 我发现感谢子帖子的子流程文档,但是在示例中,我们仅使用了两次管道。 因此,我尝试了三个命令中的两个,它可以正常工作 您能帮我执行第三条命令吗? 非常感谢你。 问题答案: 只需按照相同的示例添加第三个命令:
下面的代码片段是从JoinedStreams的javadoc复制的 这两个流仅基于一个键(通过< code>t =计算)进行连接 我会问我如何基于多个键进行连接,例如,one.a = two.a和
问题内容: 我正在使用以下代码来获取系统中正在运行的所有进程的详细信息: 我想用管道符号过滤掉,所以我用这个: 转到ErrorStream。后来我注意到管道符号(|)在Java中用作按位包含或运算符。所以我在管道符号前面使用了反斜杠,如下所示: 但是,它再次进入ErrorStream。如何在Java中执行exec? 问题答案: 管道是shell的功能-您没有使用shell,而是在执行进程()。 但