如何使用 argparse 在 python 脚本中通过管道发送参数?
How send parameters through a pipe in a python script using 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
我试过了:
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
会将 "a b" 放在 "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
是否为空
我必须创建一个可以与 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
会将 "a b" 放在 "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
是否为空