【问题标题】:How send parameters through a pipe in a python script using argparse?如何使用 argparse 在 python 脚本中通过管道发送参数?
【发布时间】:2018-04-04 17:10:13
【问题描述】:

我必须创建一个可用于 Linux 管道的 python 脚本

我想运行一个脚本,其中一些参数可以通过管道或在同一行中发送

将我的脚本与预期输出一起使用的一些示例:

echo "a" > list.txt
echo "b" >> list.txt

./run.py p1 p2   # ['p1', 'p2'] expected output
cat list.txt | ./run.py  # ['a', 'b'] expected output
cat list.txt | ./run.py p1 p2 # ['p1', 'p2', 'a', 'b'] expected output

我试过了:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('args', nargs=argparse.REMAINDER)
args = parser.parse_args().args
print args

它只适用于同一行中的参数:

./run.py p1 p2  #['p1', 'p2'] OK
cat list.txt | ./run.py  # []  Not OK
cat list.txt | ./run.py p1 p2 # ['p1', 'p2'] expected output

【问题讨论】:

  • 直接管道参数在这里不起作用,因为run.py 中没有标准输入处理程序,在不修改原始 python 脚本的情况下,xargs 等工具可以帮助构建和执行正确的命令行从标准输入管道传递参数
  • “没有处理程序”甚至没有库?
  • 我的意思是如果你想让 argparse 从标准输入中读取,你可以使用sys.stdin,例如通过添加parser.add_argument('infile', nargs='?', type=argparse.FileType('r'), default=sys.stdin) 你也可以从parser.parse_args().infile 检索输入

标签: python bash argparse


【解决方案1】:

仅使用 argparse 的解决方案

import argparse
import sys

parser = argparse.ArgumentParser()
parser.add_argument('args', nargs=argparse.REMAINDER)
parser.add_argument('stdin', nargs='?', type=argparse.FileType('r'), default=sys.stdin)
args = parser.parse_args().args

if not sys.stdin.isatty():
    stdin = parser.parse_args().stdin.read().splitlines()
else:
    stdin = []

print(args + stdin)

nargs='?' 使标准输入可选,sys.stdin.isatty() 检查sys.stdin 是否为空

【讨论】:

    【解决方案2】:

    我发现xargs 在这种情况下很有用。

    我自己没试过,但也许

    cat list.txt | xargs ./run.py p1 p2
    

    适合你吗?

    如果您需要具体说明参数的位置,可以使用xargs 占位符选项-J

    cat list.txt | xargs -J{} ./run.py p1 {} p2
    

    将“a b”放在“p1”和“p2”之间。

    【讨论】:

    • 它解决了我的问题,但是用 python 独特地解决会很好。如果没有人回应,我会批准你的回答。
    猜你喜欢
    • 2019-07-09
    • 2013-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-06
    • 2012-04-11
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多