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

时间:2019-09-03 18:49:57

标签: python command-line 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输出列表的事实之外,这实际上是有效的(实际上是kinda)。我在这里尝试做的是使用从script1.py创建的列表作为script2.py的输入,但是只将命令行参数传递一次。因此,例如,使用或继承script1.py中用于script2.py的参数。我知道可以将所有内容放到同一脚本中,但这只是一个例子,我试图在实际问题中编写一个*gml图。

知道我在这里缺少什么吗?还是我的方法有解决方法或更简单的替代方法?

1 个答案:

答案 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)