将输出从一个 python 脚本重定向到另一个 argparse



这可能是一个愚蠢的问题,但我已经为此苦苦挣扎了一段时间,我无法让它工作。基本上,我正在尝试做的是使用带有命令行传递参数的脚本输出作为另一个带有参数的脚本的输入。这是我到目前为止的方法,我有点觉得我错过了一些东西。

假设以下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.pyscript1.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)

另一种方法是,第一个脚本必须将其参数解析器公开为模块级属性,第二个脚本必须导入第一个脚本。(但是,这将绕过使用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)

最新更新