Запустите внешнюю программу для каждого элемента списка

Я пытаюсь вызвать внешнюю программу (Openbabel) для каждого элемента (молекулы) в списке молекул (формат SMILES). Тем не менее, я продолжаю получать ту же ошибку:

/bin/sh: 1: Syntax error: "(" unexpected (expecting ")").

Что не так с моим кодом?

from subprocess import call

with open('test_zinc.smi') as f:
    smiles = [(line.split())[0] for line in f]

def call_obabel(smi):
    for mol in smi:
        call('(obabel %s  -otxt -s %s -at %s -aa)' % ('fda_approved.fs', mol, '5'), shell=True)

call_obabel(smiles)

1 ответ

Решение

subprocess.call требует повторяющихся команд и аргументов. Если вам нужно передать аргументы командной строки процессу, они принадлежат итерируемым. Также не рекомендуется использовать shell=True так как это может быть угрозой безопасности. Я опущу это ниже.

Попробуй это:

def call_obabel(smi):
    for mol in smi:
        cmd = ('obabel', 'fda_approved.fs',  '-otxt', '-s', mol, '-at', '5', '-aa')
        call(cmd)
Другие вопросы по тегам