os.system抱怨圆括号

时间:2013-04-15 11:06:55

标签: python awk paste os.system

我试图在python脚本中包含这一行。

!#/bin/bash/env python

import os

os.system("paste <(awk '!/^($|[:space:]*#)/{print $0}' file1) <(awk '!/^($|[:space:]*#)/{print $0} file2) > out_file")

直接从bash运行时,该命令非常正常。但是,在脚本中,我得到:

sh: -c: line0: syntax error near unexpected token `('

使用简单时问题仍然存在:

os.system("paste <(cat file1) > output_file")

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

  

直接从bash运行时,该命令非常正常。但是,在脚本中,我得到:

sh: -c: line0: syntax error near unexpected token `('

这是因为在脚本中,您使用sh而不是bash运行命令。此命令和更简单的命令都使用bash特定功能。尝试运行sh shell并输入相同的行,您将收到相同的错误。

os.system调用不会记录它使用的shell,因为它是:

  

通过调用标准C函数system()

来实现

在大多数类Unix系统上,这会调用sh。你可能不应该依赖它...但你肯定不应该依赖它来调用bash

如果要运行bash命令,请使用subprocess模块,然后明确运行bash

subprocess.call(['bash', '-c', 'paste <(cat file1) > output_file'])

我想,你可以试着让引用权运行bash作为shell system中使用的子shell ...但为什么要这么麻烦?

这是文档反复告诉您应该考虑使用subprocess而不是os.system的众多原因之一。

答案 1 :(得分:1)

使用一个awk脚本杀死两只鸟:

awk -v DELIM=' ' '!/^($|[[:space:]]*#)/{a[FNR]=a[FNR]DELIM$0}END{for(i=1;i<=FNR;i++)print substr(a[i],2)}' file1 file2

这消除了对进程替换的需要,因此符合sh