我有两个python脚本A
和B
,两个都有一个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.py
和A.py
的参数究竟是什么样的?那么B.py
和A.py
会是什么样的呢?
编辑2: 我忘了提及必须在B.py
中创建B.py
的其中一个参数,所以顺序为执行时间为A.py
,然后是A
,B
必须能够将参数传递给A
。
答案 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)
不是在一个模块中有多个类,而是可以有多个模块,其中包含不同的类。