Как выполнить скрипт, имеющий argparse из второго скрипта - PullRequest
0 голосов
/ 04 мая 2019

У меня есть этот простой скрипт с именем test1.py.

#!/usr/bin/env python

from argparse import ArgumentParser


def cmdlineparse():
    parser = ArgumentParser()
    parser.add_argument("-tid", dest="CHEMBL_TARGET_ID", required=True, type=str)
    parser.add_argument("-molfile", dest="XTEST_MOLFILE", required=False, type=str)

    args=parser.parse_args()
    return args


if __name__ == '__main__':

    args = cmdlineparse()

    print("The given CHEMBL_TARGET_ID is %s" % args.CHEMBL_TARGET_ID)
    print("The given XTEST_MOLFILE is %s" % args.XTEST_MOLFILE)

Обычно я выполняю это так ./test1.py -tid CHEMBL8868 -molfile ligands.sdf.

Я хочу выполнить это несколько раз из второго скрипта с именем test2.py. Самым простым решением было бы назвать его, используя subprocess.call или что-то эквивалентное.

subprocess.call("./test1.py -tid CHEMBL8868 -molfile ligands.sdf".split(), shell=True, executable='/bin/bash')

Однако я хотел бы сделать это более элегантным способом, а именно, импортируя его как модуль и передавая значения в argparse. Может кто-нибудь показать мне, как это сделать?

1 Ответ

2 голосов
/ 04 мая 2019

Вам нужно будет немного реорганизовать ваш скрипт: пусть cmdlineparse возьмет список аргументов для анализа и определит функцию main, которая выполняет фактическую работу вместо пустого блока, охраняемого __main__.

#!/usr/bin/env python

from argparse import ArgumentParser


def cmdlineparse(args):
    parser = ArgumentParser()
    parser.add_argument("-tid", dest="CHEMBL_TARGET_ID", required=True, type=str)
    parser.add_argument("-molfile", dest="XTEST_MOLFILE", required=False, type=str)

    args=parser.parse_args(args)
    return args

def main(args=None):
    args = cmdlineparse(args)
    print("The given CHEMBL_TARGET_ID is %s" % args.CHEMBL_TARGET_ID)
    print("The given XTEST_MOLFILE is %s" % args.XTEST_MOLFILE)


if __name__ == '__main__':
    main()

Без аргумента, main будет анализировать текущие аргументы командной строки, поскольку значение None, переданное (в конечном итоге) в parser.parse_args(), приведет к его анализу sys.argv[1:].

Теперь вы можете импортировать test1 и вызывать main явно столько раз, сколько захотите:

import test1

test1.main(["-tid", "CHEMBL8868", "-molfile", "ligands.sdf"])
test1.main(["-tid", "CHEMBL8293", "-molfile", "stuff.sdf"])
# etc
...