2017-10-24 7 views
1

나는 리눅스 파이프와 함께 사용할 수있는 파이썬 스크립트를 작성해야argparse를 사용하여 파이썬 스크립트에서 파이프를 통해 매개 변수를 보내는 방법은 무엇입니까?

나는 일부 매개 변수는 파이프 또는 같은 라인

의 사용의 예를 보낼 수있는 스크립트를 실행하려면 예상되는 출력을 내 스크립트를

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 

그것은 t의 매개 변수에서만 작동 그는 같은 라인 :

./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 
+0

직접 실행'에서 표준 입력 처리기가 아니기 때문에 여기에 작동하지 않습니다 인수를 배관 .py'와 같이 원래의 파이썬 스크립트를 수정하지 않고'xargs'와 같은 도구를 사용하면 stdin – etopylight

+0

에서 파이프 라인 된 인수를 사용하여 올바른 명령 행을 빌드하고 실행할 수 있습니다. "핸들러가 없어도 라이브러리가 아닌가? – Troncador

+0

argparse를 stdin에서 읽으려면 'parser.add_argument ('infile ', nargs ='? ', type = argparse.FileType ('r '))를 추가하여'sys.stdin'을 사용할 수 있습니다. , default = sys.stdin)'parser.parse_args(). infile'에서 입력을 가져올 수 있습니다. – etopylight

답변

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() 검사를하게

1

내가 이러한 경우에 유용 xargs을 찾을 수 있습니다.

나는 나 자신을 시도하지만, 아마도

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

작동하지?

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

는 "P1"과 "P2"사이의 "B"를 둘 것 : 인수가 어디로 경우

당신은 당신이 xargs 자리 옵션 -J을 사용하여 특정 할 필요가있다. sys.stdin이 비어있는 경우

+0

내 문제를 해결하지만 파이썬으로 유일하게 해결하는 것이 좋을 것입니다. 아무도 응답하지 않으면 귀하의 답변을 승인합니다. – Troncador