将外部程序运行到列表的每个元素

时间:2017-08-03 12:06:04

标签: python subprocess call openbabel

我试图将外部程序(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 个答案:

答案 0 :(得分:0)

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)