Python Awk 的子进程

Python SubProcess For Awk

我正在尝试在 Python 中将此 awk 命令与子进程一起使用,但我不确定如何使用双管道。我宁愿不使用 shell=True 因为这是不好的做法。我已经能够合并其他 awk 命令,但其中 none 需要双管道。

awk 'FNR==NR{if([=15=]~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)' file.txt file.txt

这将删除最后一次出现的 "name" 之后的 4 行。这是我的文件的原始内容:

name: file1
name: file2
name: file3




file4
file5
file6

运行 终端中的此命令将 return:

name: file1
name: file2
name: file3
file4
file5
file6

我正在尝试使用 python 子进程从 python 文件中执行此操作,但我不确定如何使用。

这是我最初的方法:

import os
import sys
import subprocess as sb

sb.Popen('awk','FNR==NR{if([=13=]~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)','file.txt','file.txt')

这是我得到的错误:

TypeError: bufsize must be an integer

关于如何在没有 shell=True 的情况下执行此操作的任何帮助?

您需要将命令的参数放在列表中 ([]),否则它们最终将被分配给 bufsizeexecutable 等,而不是你想让他们去哪里:

sb.Popen(['awk','FNR==NR{if([=10=]~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)','file.txt','file.txt'])

||无关。