如何使用argparse在python脚本中通过管道发送参数?
我必须创建一个可以与Linux管道一起使用的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
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来唯一地解决。如果没有人回答,我会同意你的回答。