如何使用argparse通过python脚本中的管道发送参数?

Tro*_*dor 2 python bash argparse

我必须创建一个可以与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
Run Code Online (Sandbox Code Playgroud)

我试过了:

import argparse
parser = argparse.ArgumentParser()
parser.add_argument('args', nargs=argparse.REMAINDER)
args = parser.parse_args().args
print args
Run Code Online (Sandbox Code Playgroud)

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

./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 Code Online (Sandbox Code Playgroud)

eto*_*ght 5

仅使用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)
Run Code Online (Sandbox Code Playgroud)

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