1

我有两个 python 脚本AB,都有一个 main 和不同的输入参数(我使用argparse)。我通常使用以下方式启动它们:

$ python A.py --paramA1 valA1 --paramA2 valA2
$ python B.py --paramB1 valB1 --paramB2 valB2

我希望能够B从内部调用A并在启动时指定B's 参数A。简而言之,我想AA's 参数和B's 参数调用。从外面看它应该是这样的:

$ python A.py --paramA1 valA1 --paramA2 valA2 --paramB1 valB1 --paramB2 valB2

有没有比将代码复制粘贴到然后调用它们更优雅B的方法呢?argparseAB

编辑:为了简化事情,这里有一些示例代码:

一个.py:

import argparse
def main():
    parser = argparse.ArgumentParser(description="Args for A.py")
    parser.add_argument("--param1A", type=int)
    parser.add_argument("--param2A", type=int)
    args = parser.parse_args()
    valA1 = args.param1A
    valA2 = args.param2A
    ...
    return 0

B.py:

import argparse
def main():
    parser = argparse.ArgumentParser(description="Args for B.py")
    parser.add_argument("--param1B", type=int)
    parser.add_argument("--param2B", type=int)
    args = parser.parse_args()
    valA1 = args.param1B
    valA2 = args.param2B
    ...
    return 0

建议的 究竟是什么C.py,包括两者的论点A.pyB.py外观?A.py那时会是什么样B.py子?

编辑2:我忘了提到B.py必须在 中创建A.py,因此执行顺序是A然后B,并且A必须能够将参数传递给B

4

2 回答 2

2

您可以创建一个C.py包含通用argparse逻辑并由 A 和 B 导入的模块。

从 A 调用 B 时,您还可以将已解析的参数传递给 B。我的意思是,A 和 B 都应该有一个类似main函数的东西,它接受已经解析的参数,因此不必进行两次解析。

py

import argparse

def create_parser():
    parser = argparse.ArgumentParser(description="Args for B.py")
    parser.add_argument("--param1B", type=int)
    parser.add_argument("--param2B", type=int)
    return parser

py

import argparse
import sys
import C

def main(args):
    valB1 = args.param1B
    valB2 = args.param2B
    # do stuff
    return 0

if __name__ == '__main__':
    parser = C.create_parser()
    args = parser.parse_args()
    sys.exit(main(args))

py

import argparse
import sys
import C
import B

def main(args):
    valA1 = args.param1A
    valA2 = args.param2A
    # do stuff
    return 0


if __name__ == '__main__':
    parser = C.create_parser()
    parser.add_argument("--param1A", type=int)
    parser.add_argument("--param2A", type=int)
    args = parser.parse_args()
    B.main(args)
    sys.exit(main(args))
于 2013-04-08T09:47:20.630 回答
1

我认为@Ioan Alexandru Cucu 描述的内容类似于以下内容:

import argparse

class A():
    __init__(self, param1A, param2A, param1B=None, param2B=None):
        if(param1B and param2B):
            myB = B(param1B, param2B)
        #Do processing here ...
        return 0


class B():
    __init__(self, param1B, param2B):
        #Do processing here ...
        return 0

if(__name__ == '__main__'):
    parser = argparse.ArgumentParser(description="Args for A and/or B")

    parser.add_argument("--param1A", type=int)
    parser.add_argument("--param2A", type=int)

    parser.add_argument("--param1B", type=int)
    parser.add_argument("--param2B", type=int)

    args = parser.parse_args()

    if(args.param1A and args.param2A and args.param1B and args.param2B):
        A(args.param1A, args.param2A, args.param1B, args.param2B)
    if(args.param1A and args.param2A):
        A(args.param1A, args.param2A)
    elif(args.param1B and args.param2B):
        B(args.param1B, args.param2B)

您可以在多个模块中包含不同的类,而不是在一个模块中包含多个类。

于 2013-04-08T10:43:56.017 回答