我们有一个脚本用于查找测试名称,它在公司中被广泛使用。它的命令行操作如下:
find_test.py --type <type> --name <testname>
脚本内部等同于:
import argparse
parser = argparse.ArgumentParser(description='Get Test Path')
parser.add_argument('--type', dest='TYPE', type=str, default=None, help="TYPE [REQUIRED]")
parser.add_argument('--name', dest='test_name', type=str, default=None, help="Test Name (Slow)")
parser.add_argument('--id', dest='test_id', type=str, default=None, help="Test ID (Fast)")
parser.add_argument('--normalise', dest='normalise', action="store_true", default=False, help="Replace '/' with '.' in Test Name")
args = parser.parse_args()
# 不确定所有这些参数的作用,我个人只使用前两个。这些行后跟使用这些参数的代码。
我想重构此脚本,以便我可以将其导入为模块,同时保留其命令行功能 - 因为许多人使用此脚本,并且它也在我们的一些 csh 脚本中被调用。
到目前为止,我已经对其进行了重构,如下所示:
def _main():
<all the former code that was in find_test.py>
if __name__ == "__main__":
_main()
这样仍然可以在命令行中正常运行。但我不确定如何在父脚本中使用相关开关向其中传递参数。
如何进一步重构此脚本,然后在父脚本中调用它?这可能吗?
我还不想使用 docopts,据我了解它是新的 argparse,除非必要 - 即不能使用 argparse,因为它没有在公司范围内安装,这可能是一个繁琐的过程。
2、解决方案
def main(TYPE, test_name, test_id=None, normalise=False):
# ... body of script...
if __name__ == "__main__":
parser = ...
...
args = parser.parse_args()
main(**vars(args))
上述的重构方案中,您只需将需要运行的代码移动到一个名为 main() 的函数中。然后,您可以将解析器代码留在 name == 'main' 块中,并将其结果传递给 main()。
这样,您就可以在脚本中调用 main() 函数,传递必要的参数,而不必担心命令行解析器。
以下是一些代码示例:
# find_test.py
def main(TYPE, test_name, test_id=None, normalise=False):
# ... body of script...
if __name__ == "__main__":
parser = argparse.ArgumentParser(description='Get Test Path')
parser.add_argument('--type', dest='TYPE', type=str, default=None, help="TYPE [REQUIRED]")
parser.add_argument('--name', dest='test_name', type=str, default=None, help="Test Name (Slow)")
parser.add_argument('--id', dest='test_id', type=str, default=None, help="Test ID (Fast)")
parser.add_argument('--normalise', dest='normalise', action="store_true", default=False, help="Replace '/' with '.' in Test Name")
args = parser.parse_args()
main(**vars(args))
# parent_script.py
from find_test import main
main(TYPE="my_type", test_name="my_test_name")
在 parent_script.py 中,我们首先从 find_test.py 导入 main() 函数。然后,我们调用 main() 并传递适当的参数。这将运行 find_test.py 中的代码,就像从命令行调用它一样。