将输出从一个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)