这可能是一个愚蠢的问题,但是我已经为此苦苦挣扎了一段时间,但我无法使其工作。基本上我想做的是使用脚本输出和命令行传递的参数作为另一个带有参数的脚本的输入。到目前为止,这是我的做法,但我仍然觉得自己缺少一些东西。
让我们假设以下script1.py
# !/usr/bin/env python3
import argparse
import sys
def create_arg_parser():
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--number", type=int, help="numbers range")
return parser.parse_args()
def main_a():
nrange = parsed_args.number
l = [i for i in range(nrange)]
return l
if __name__ == "__main__":
parsed_args = create_arg_parser()
print(main_a())
和script2.py
# !/usr/bin/env python3
import os
import subprocess
import argparse
def create_arg_parser():
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--outdir", type=str, help="outdir path")
return parser.parse_args()
def main_b():
# the -n argument here should be inherited from script1.py and not manually set to 5
process = subprocess.Popen(["python", "script1.py", "-n", "5"], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate() # let it run the list from script1.py
with open(os.path.join(parsed_args.outdir, "list.txt"), "w") as f:
f.write(output[0].decode('utf-8'))
if __name__ == "__main__":
parsed_args = create_arg_parser()
main_b()
除了我正在从script1.py
参数旁边编写的-n
输出列表的事实之外,这实际上是有效的(实际上是kinda)。我在这里尝试做的是使用从script1.py创建的列表作为script2.py的输入,但是只将命令行参数传递一次。因此,例如,使用或继承script1.py
中用于script2.py
的参数。我知道可以将所有内容放到同一脚本中,但这只是一个例子,我试图在实际问题中编写一个*gml
图。
知道我在这里缺少什么吗?还是我的方法有解决方法或更简单的替代方法?
答案 0 :(得分:0)
虽然您可以从另一个解析器继承参数,但在您的用例中,只需显式定义一个参数会更简单,因为您必须将产生的 value 值传递给另一个脚本。
# !/usr/bin/env python3
import os
import subprocess
import argparse
def parse_arguments():
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--number", type=int, help="numbers range")
parser.add_argument("-o", "--outdir", type=str, help="outdir path")
return parser.parse_args()
def main_b(args):
# the -n argument here should be inherited from script1.py and not manually set to 5
process = subprocess.Popen(["python", "script1.py", "-n", args.number], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = process.communicate() # let it run the list from script1.py
with open(os.path.join(parsed_args.outdir, "list.txt"), "w") as f:
f.write(output[0].decode('utf-8'))
if __name__ == "__main__":
parsed_args = parse_arguments()
main_b(parsed_args)
另一种选择是,第一个脚本必须将其参数解析器公开为模块级属性,而第二个脚本则必须 import 。 (不过,这将避免使用subprocess
运行第一个脚本的需要。
import argparse
import sys
parser = argparse.ArgumentParser()
parser.add_argument("-n", "--number", type=int, help="numbers range")
def main_a(n):
l = [i for i in range(n)]
return l
if __name__ == "__main__":
nrange = parser.parse_args().number
print(main_a(nrange))
和
import os
import argparse
import script1
def parse_arguments():
parser = argparse.ArgumentParser(parents=[script1.parser])
parser.add_argument("-o", "--outdir", type=str, help="outdir path")
return parser.parse_args()
def main_b(parsed_args):
x = script1.main_a(parsed_args.number)
with open(os.path.join(parsed_args.outdir, "list.txt"), "w") as f:
f.write(str(x))
if __name__ == "__main__":
parsed_args = parse_arguments()
main_b(parsed_args)