2015-10-30 2 views
3

Я знаю, что этот вопрос задавался несколько раз, я читал несколько вопросов, пытаясь решить эту проблему. Однако ни один из них не работал.running python script внутри 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, например. 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() 

В качестве альтернативы, вы можете сохранить идентификатор во временный файл и использовать перенаправление ввода (<).

+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() 

Выходной поток команды будет поступать в в «из» и поток ошибок будет поступать в «подстраховаться».

+0

Это дало мне ту же ошибку. – ifreak

+0

Я не знаю, является ли это жизнеспособным способом запуска вашей программы, но вы можете попробовать: cmd = "echo '% d' |/usr/packages/kg-master/bin/kg --mergecol = 0 - noheader --genes --definition --species = hsa "% pathwayID –

+0

Предполагая, что pathwayID является числом, в противном случае используйте% s –