Python:“导入”输入参数

时间:2013-04-08 09:42:36

标签: python input arguments argparse

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

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

我希望能够在B内拨打A并在启动B时指定A的参数。简而言之,我想使用A的参数和A的参数来调用B。这是从外面看起来的样子:

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

除了将B的{​​{1}}代码复制并粘贴到argparse然后在其上调用A之外,还有更优雅的方法吗?

编辑:为简化起见,这里有一些示例代码:

A.py:

B

B.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

建议的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.pyA.py的参数究竟是什么样的?那么B.pyA.py会是什么样的呢?

编辑2: 我忘了提及必须在B.py中创建B.py的其中一个参数,所以顺序为执行时间为A.py,然后是AB必须能够将参数传递给A

2 个答案:

答案 0 :(得分:2)

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

当从A调用B时,您也可以传递B已经解析过的args。我的意思是,A和B都应该有类似main函数的东西,它接受已经解析过的args,因此不需要进行两次解析。

C.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

B.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))

A.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))

答案 1 :(得分: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)

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