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

如何使用argparse在python脚本中通过管道发送参数?,python,bash,argparse,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 | ./r

我必须创建一个可以与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

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

我自己也没试过,但也许

cat list.txt | xargs ./run.py p1 p2
为你工作

如果需要指定参数的位置,可以使用
xargs
占位符选项
-J

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

将“ab”放在“p1”和“p2”之间。

仅使用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=“?”
使stdin成为可选的,并且
sys.stdin.isatty()
检查
sys.stdin
是否为空,因为在
run.py
中没有stdin处理程序,因此不修改原始python脚本,像
xargs
这样的工具可以帮助构建和执行正确的命令行,并使用从stdin导出的参数“没有处理程序”甚至没有库?我的意思是,如果希望argparse从stdin读取,可以使用
sys.stdin
,例如通过添加
parser.add_参数('infle',nargs='?',type=argparse.FileType('r')),default=sys.stdin)
您可以从
parser.parse_args()检索输入。infle
too它解决了我的问题,但最好用python来唯一地解决。如果没有人回答,我会同意你的回答。