我正在尝试从python脚本执行以下awk
命令
awk 'BEGIN {FS="\t"}; {print $1"\t"$2}' file_a > file_b
为此,我尝试使用subprocess
,如下所示:
subprocess.check_output(["awk", 'BEGIN {FS="\t"}; {print $1"\t"$2}',
file_a, ">",
file_b])
其中file_a
和file_b
是指向文件路径的字符串。
由此,我收到错误
awk:无法打开> (没有这样的文件或目录)
我确定我以错误的方式输入subprocess
的参数,但我无法弄清楚错误。
答案 0 :(得分:2)
虽然它可能在您选择的shell中看起来像>
,<
和|
实际上并未作为参数传递给您运行的程序。相反,它们是程序永远不会看到的shell的特殊部分。
由于它们是shell的一部分,而不是操作系统或程序的一部分,因此您必须使用语言为您提供的常规工具自己模拟其效果。在您的情况下,由于您正在尝试管道传输文件,只是像平常一样使用Python的open()
。 subprocess
API支持指定stdout,stdin和stderr的参数,您可以为这些提供任何文件对象。
检查出来:
with open(file_b, 'wb') as f:
subprocess.call(["awk", 'BEGIN {FS="\t"}; {print $1"\t"$2}', file_a], stdout=f)
由于subprocess.check_output
已经重定向输出,因此不会使用stdout
参数。使用subprocess.call
可以避免这种情况。如果您稍后还需要在脚本中输出,则可以将check_output
的返回值指定给变量,然后将其保存到file_b
。
如果你使用了很多shell命令,你可能还想看看Plumbum,这会给你一大堆相当愚蠢的类似shell的运算符重载。