2015-01-16 66 views
0

我试图格式化以下awk命令格式化蟒子命令popen方法

awk -v OFS="\t" '{printf "chr%s\t%s\t%s\n", $1, $2-1, $2}' file1.txt > file2.txt 

在蟒子POPEN使用。不过,我很难格式化它。我尝试了类似答案中提出的解决方案,但都没有工作。我也尝试使用原始字符串文字。此外,我不希望使用壳=真,因为这是不推荐

根据评论

编辑: 我试过命令是

awk_command = """awk -v OFS="\t" '{printf "chr%s\t%s\t%s\n", $1, $2-1, $2}' file1.txt > file2.txt""" 
command_execute = Popen(shlex.split(awk_command)) 

但是我在执行这个

出现以下错误
KeyError: 'printf "chr%s\t%s\t%s\n", $1, $2-1, $2' 

google搜索错误提示,当请求为未定义键的值出现这种情况,但我不明白这里的上下文

+1

欢迎来到SO!你向我们展示了你想要的,但不是你得到的,也不是产生它的代码。如果没有其他信息,我们很难帮助。 – AlG

+2

从python中清除awk就像是将相机指向电视机,从另一台电视机上观看。你看过're'模块吗? –

+0

你应该使用原始字符串文字:比较:'print(r'“\ t”')'与'print('“\ t”')''。 – jfs

回答

0
  1. 最简单的方法,特别是如果你想保持输出重定向的东西,是subprocessshell=True - 那么你只需要转义Python特殊字符。该行作为一个整体将由默认shell解释。

    • 警告:不要将此与不受信任的输入一起使用,而不要先将其消毒!
  2. 或者,也可以代替用argv型序列中的命令行和饲料,为subprocess代替。然后,你需要提供的东西,该程序会看到它:

    • 删除所有的外壳层逸出
    • 删除输出重定向的东西,做重定向你自己,而不是

关于具体问题:

  • 你没有转义python字符串中的特殊字符\t\n成了文字标签和换行符(尝试print awk_command)使用
  • shlex.splitshell=True没有什么不同 - 与添加的不可靠性,因为它不能保证是否会解析字符串以同样的方式在你的shell会在每一种情况下(不提到外壳缺乏变化)。

    • 具体来说,它不知道或关心的重定向部分的特殊含义:

      >>> awk_command = """awk -v OFS="\\t" '{printf "chr%s\\t%s\\t%s\\n", $1, $2- 1, $2}' file1.txt > file2.txt""" 
      >>> shlex.split(awk_command) 
      ['awk','-v','OFS=\\t','{printf "chr%s\\t%s\\t%s\\n", $1, $2-1, $2}','file1.txt','>','file2.txt'] 
      

所以,如果你想使用shell=False,做构建参数列表你自己。

+0

我试图避免shell = True。另外根据后面的编辑我使用shlex.split()应该相应地拆分它,但不知何故我得到Keyerror,我无法调试它的原因在这里。 – pd0321

+0

嘿,非常感谢评论。我想我的紧迫感我会去使用shell = True,但即使如此,我也无法让它工作。我用shell = True的命令是'Popen(“”“awk -v OFS =”\\ t“'{printf'chr%s \\ t%s \\ t%s \\ n',$ 1,$ 2 -1,$ 2}'file1.txt> file2.txt“”“,shell = True)'不过,我想用%s的部分没有正确地翻译awk – pd0321

+0

单引号内有单引号。 –

1

>是shell重定向操作符。为了实现它在Python,使用stdout参数:

#!/usr/bin/env python 
import shlex 
import subprocess 

cmd = r"""awk -v OFS="\t" '{printf "chr%s\t%s\t%s\n", $1, $2-1, $2}'""" 
with open('file2.txt', 'wb', 0) as output_file: 
    subprocess.check_call(shlex.split(cmd) + ["file1.txt"], stdout=output_file) 

为了避免启动一个单独的进程,你可以实现在纯Python这个特殊awk命令。