【问题标题】:How to execute a script that has argparse from within a second script如何从第二个脚本中执行具有 argparse 的脚本
【发布时间】:2019-09-22 18:33:23
【问题描述】:

我有一个名为 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。有人可以告诉我怎么做吗?

【问题讨论】:

  • parse_args() 从列表 sys.argv 获取值,但您可以使用自己的列表 parse_args(my_list)

标签: python parameter-passing argparse


【解决方案1】:

您需要稍微重构一下您的脚本:让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 将解析当前命令行参数,因为(最终)传递给 parser.parse_args() 的值 None 将导致它解析 sys.argv[1:]

现在您可以随意导入test1 并显式调用main

import test1

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

【讨论】:

  • 是否可以在if __name__ == '__main__':中包含打印语句?
  • 你可以放任何你想要的东西;除了首先设置 __name__ 值的“魔法”之外,它真的没有什么特别之处。
  • 我的意思是印刷品只是一个例子。我必须转移 main() 定义下的所有执行代码,否则什么都不会执行。
  • 我不确定你在问什么。关键是在if 块之外,您只有 有函数定义和(可能)变量定义。您可以在if 块中调用main(作为入口点),这样test1 仍然可以用作脚本,但如果您将test1 作为常规模块导入,除非您显式调用它们,否则不会调用任何定义的函数。
  • 好的,那我将把所有的执行代码移到main()里面。
猜你喜欢
  • 1970-01-01
  • 2022-07-08
  • 2016-10-02
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
  • 2021-01-15
  • 2022-01-01
  • 1970-01-01
相关资源
最近更新 更多