2012-04-03 136 views
1

我正在面對一個在python中使用subprocess.call操作符的尷尬問題。 我必須多次運行流水線程序(bowtie),然後以不同的方式使用輸出。爲此,我使用subprocess.call。在python中使用subprocess.call的多堆stdin

問題是領結需要輸入2個文件,一個索引和一個文本文件,我無法將它們都分配給stdin參數。

我已經嘗試過在args中包含索引的路徑,但當然bowtie不會將它識別爲索引並給我一個錯誤。既然這個指標總是一樣的,有沒有辦法避免這個問題?

這裏是我的工作(非常原始)的部分代碼:

inpath = "/media/2tbhd/workdata/nanocage_noadapt/zf/fasta/zf_ad_c_r2.fasta" 
ind_path = "indexes/zf_gen_topl" 
for elem in plist: 
     cmd = subprocess.call(["bowtie","-f","-v 3", "--best" "--suppress 6,7" "-p 6"], shell = True, stdin = inpath, ind_path) 
+0

如何從命令行調用'bowtie'?您不能將任何編程語言中的兩個文件分配給標準輸入,我知道...「 – mgilson 2012-04-03 18:11:26

+1

」但當然,領結不會將其識別爲索引並給我一個錯誤「 - 它具體給出了什麼錯誤消息? – 2012-04-03 18:13:22

+0

請嘗試編寫一個簡單的shell命令,以您想要的方式調用bowtie,並查看它是否有效。如果它確實起作用,請將其粘貼到此處,並且如何將其轉換爲subprocess.call函數將會更容易。如果它不起作用,我可以試着弄清楚你對bowtie做錯了什麼。 – weronika 2012-04-03 21:56:55

回答

0

我不知道什麼bowtie,但在我看來,你的電話應該是這樣的:

cmd = subprocess.call(['bowtie','-f',inpath,'-v','3', '--best','--suppress','6,7','-p','6',ind_path]) 

通常情況下,您將參數列表傳遞給子進程,與您在命令行中使用它們完全相同。如果您知道命令行的外觀,您可以使用美妙的shlex模塊來分割命令。例如:

import shlex 
import subprocess 
cmd=subprocess.call(shlex.split("ls -al")) 
0

如果您輸入的文件實際上是一個文件(這是它看起來像在你的例子),而不是從其他一些工藝管道的數據,我不認爲你應該在你的子使用STDIN .call功能!
據我所知,你不能通過STDIN提供索引到正常的命令行領結 - 它必須是一個文件。所以這肯定是一個普通的論點,而不是來自STDIN。

這是怎麼了,我通常稱之爲領結從腳本(同時與輸入文件和索引文件,沒有STDIN使用):

subprocess.call(["bowtie %s %s %s %s"(full_options,indexname,infile,outfile)], 
       shell=True) 

full_options是像'-f -m1 -v1 --best --tryhard -S --sam-nosq'indexname是一樣的東西'Chlre4nm_cassette_new_m' (這是一個形式爲Chlre4nm_cassette_new_m。*。ebwt的索引文件名集的基名,位於由shell環境變量$BOWTIE_INDEXES給出的目錄中,這是bowtie檢測其索引文件的方式)。

我意識到我可能使用subprocess.call很糟糕,應該將我的命令/選項/參數拆分成類似於其他答案的列表 - 這是舊代碼,但它確實有效。

+0

你打電話給我的方式(我相信)你不需要把「bowtie%s ...」放在一個列表中...我認爲subprocess.call會接受一個字符串。將字符串拆分爲列表的好處是,您可以刪除對應該更高效的shell的依賴性,並且不太容易受到惡意用戶的攻擊......如果腳本如果供您使用(並且您不是惡意的),並且性能不是問題,那麼您認爲我的意見完全可以接受... – mgilson 2012-04-04 00:55:36

+0

@mgilson - 很高興知道,謝謝!我知道這是行得通的(它是我實際使用的代碼),但我不知道是否有任何理由將它分成列表。一個問題:「刪除對shell的依賴」究竟意味着什麼?我在問,因爲我不確定可以爲蝴蝶結做到這一點,因爲它依賴於$ BOWTIE_INDEXES shell變量來查找它的索引文件 - 如果我設置shell = False它仍然可以工作嗎? – weronika 2012-04-04 01:03:44

+0

我的印象是subprocess實際上會產生一個新的shell(/ bin/sh)來執行這個命令,但是這個文檔在這一點上實際上是模糊的......但是,它確實表示它相當於產生一個新shell ...無論如何,如果在環境中設置shell變量,應該由python和python創建的任何子進程繼承它(除非使用env關鍵字...)http://docs.python .ORG /庫/ subprocess.html#POPEN構造函數 – mgilson 2012-04-04 01:10:07

相關問題