用于双管道命令的Python子进程

问题描述 投票:0回答:1

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

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

这将在最后一次出现的“名称”之后删除4行。这是我原来文件的内容:

name: file1
name: file2
name: file3




file4
file5
file6

在终端中运行此命令将返回:

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($0~/name: /){line=FNR};next} FNR<=line || FNR>(line+4)','file.txt','file.txt')

这是我得到的错误:

TypeError: bufsize must be an integer

在没有shell=True的情况下如何做到这一点的任何帮助?

python unix awk subprocess pipe
1个回答
0
投票

您需要将命令的参数放入列表([])中,否则它们最终将被分配给bufsizeexecutable等,而不是您希望将它们放在何处:

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

||无关。

© www.soinside.com 2019 - 2024. All rights reserved.