Я обычно так делаю для stati c command
from subprocess import check_output
def sh(command):
return check_output(command, shell=True, universal_newlines=True)
output = sh('echo hello world | sed s/h/H/')
НО ЭТО НЕ БЕЗОПАСНО !!! Вы должны сделать инъекцию оболочки
from subprocess import check_output
from shlex import split
def sh(command):
return check_output(split(command), universal_newlines=True)
output = sh('echo hello world')
Разница небольшая, но важная. shell = True создаст новую оболочку, поэтому трубы et c будут работать. Я использую это, когда у меня есть большая командная строка с конвейерами, и это stati c, я имею в виду, это не зависит от ввода пользователя. Это связано с тем, что в этом варианте возможна инъекция оболочки, пользователь может ввести something; rm -rf /
, и он будет запущен.
Второй вариант принимает только одну команду, он не создает оболочку, вместо этого он запускает команду прямо. Таким образом, никакие каналы и подобные оболочки не будут работать, и это безопаснее.
universal_newlines=True
предназначен для вывода в виде строки, а не байтов. Используйте его для вывода текста, если вам нужен двоичный вывод, просто опустите его. По умолчанию - false.
Итак, вот полный пример
from subprocess import check_output
from shlex import split
def sh(command):
return check_output(split(command), universal_newlines=True)
for line in inputFile:
cmd = 'python3 CRISPRcasIdentifier.py -f %s/%s.fasta -o %s/%s.csv -st dna -co %s/'%(inputpath,line.strip(),outputfolder,line.strip(),outputfolder)
sh(cmd)
Ps: Я не тестировал это