将输出从一个python脚本重定向到另一个argparse
这可能是一个愚蠢的问题,但我已经为此挣扎了一段时间,我无法让它工作。基本上,我要做的是使用带有命令行传递参数的脚本输出作为另一个带有参数的脚本的输入。到目前为止,这是我的方法,我觉得我遗漏了一些东西 让我们假设以下将输出从一个python脚本重定向到另一个argparse,python,command-line,argparse,Python,Command Line,Argparse,这可能是一个愚蠢的问题,但我已经为此挣扎了一段时间,我无法让它工作。基本上,我要做的是使用带有命令行传递参数的脚本输出作为另一个带有参数的脚本的输入。到目前为止,这是我的方法,我觉得我遗漏了一些东西 让我们假设以下script1.py # !/usr/bin/env python3 import argparse import sys def create_arg_parser(): parser = argparse.ArgumentParser() parser.add_
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
参数一起编写之外。我在这里试图做的是使用从script1.py创建的列表作为script2.py中的输入,但只传递一次命令行参数。例如,在script2.py
中使用或继承用于script1.py
的参数。我知道这可以用同一个脚本来完成,但这只是一个例子,我试图在实际问题中编写一个*gml
图
你知道我在这里遗漏了什么吗?或者有什么解决方法或更简单的替代方法吗?虽然您可以从另一个解析器继承参数,但对于您的用例,只显式定义参数会更简单,因为您必须将结果的值传递给另一个脚本
# !/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 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)