2015-01-16 63 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命令。