2015-10-30 24 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 –