2015-10-30 180 views
3

我知道這個問題已被多次詢問,我讀了多個試圖解決這個問題的問題。但是,這些實際上都沒有工作。在Python中運行python腳本

我有一個Python腳本,我從以下網站下載:https://github.com/endrebak/kg

我試圖從內部蟒蛇運行下面的命令。它的工作原理,當我直接從終端上運行,但拋出一個錯誤,當我從裏面蟒蛇運行:

/usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes --definition --species=hsa <(echo 01200) 

使用下面的代碼:

pathwayID = 01200 

cmd="/usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes --definition --species=hsa <(echo {})".format(pathwayID) 

tmp = os.popen(cmd).read() 

不過,我發現了以下錯誤:

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

sh: -c: line 0: `/usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes --definition --species=hsa <(echo 05200)' 

我試過多種建議,比如調用腳本之前加入python

cmd="python /usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes --definition --species=hsa <(echo {})".format(pathwayID) 

另一項建議是使用:

subprocess.call(['/usr/packages/kg-master/bin/kg', "--mergecol=0","--noheader","--genes","--definition","--species=hsa <(echo '01200')"]) 

該解決方案是最接近由於執行腳本實際問題的解決。但是,似乎參數沒有正確傳遞,我不知道爲什麼。

任何幫助,將不勝感激。

回答

2

要使用subprocess運行此命令,您需要使用可理解process substitution語法的shell,例如, bash/bin/sh,這是subprocess使用的默認外殼,不支持它。

import subprocess 

cmd = ("/usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes" 
     "--definition --species=hsa <(echo {})".format(pathwayID)) 

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, 
          stderr=subprocess.PIPE, executable="/usr/bin/bash") 
out, err = process.communicate() 

或者,您可以將ID保存到臨時文件並使用輸入重定向(<)。

+0

這實際上解決了這個問題。謝謝。 – ifreak

0

嘗試這種情況:

import subprocess 

cmd="/usr/packages/kg-master/bin/kg --mergecol=0 --noheader --genes --definition --species=hsa <(echo {})".format(pathwayID) 

process = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
out, err = process.communicate() 

的命令的輸出流將在「出」和誤差流管道輸送到將被管道輸送到「ERR」。

+0

這給了我同樣的錯誤。 – ifreak

+0

我不知道這是否是一種可行的方式來運行你的程序,但你可以試試:cmd =「echo'%d'|/usr/packages/kg-master/bin/kg --mergecol = 0 - noheader --genes --definition --species = hsa「%pathwayID –

+0

假設pathwayID是一個數字,否則使用%s –