5

sys.stdin.readline()戻る前にEOF(または改行)を待機するため、コンソール入力がある場合は、ユーザー入力を待機readline()します。代わりに、ヘルプを出力し、処理するものがない場合はエラーで終了し、ユーザー入力を待ちません。

理由:コマンドラインの動作が。に似ているPythonプログラムを作成しようとしていgrepます。

テストケース:

入力もパイプもありません。ヘルプを印刷してください

$ argparse.py
argparse.py - prints arguments

echo $?            # UNIX
echo %ERRORLEVEL%  # WINDOWS
2

解析されたコマンドライン引数

$ argparse.py a b c 
0 a
1 b
2 c

パイプコマンドを受け入れる

$ ls | argparse.py
0 argparse.py
1 aFile.txt

parseargs.pyリスト:

# $Id: parseargs.py

import sys
import argparse

# Tried these too:
# import fileinput - blocks on no input
# import subprocess - requires calling program to be known

def usage():
    sys.stderr.write("{} - prints arguments".fomrat(sys.argv[0])
    sys.stderr.flush()
    sys.exit(2)

def print_me(count, msg):
    print '{}: {:>18} {}'.format(count, msg.strip(), map(ord,msg))

if __name__ == '__main__':
    USE_BUFFERED_INPUT = False
    # Case 1: Command line arguments  
    if len(sys.argv) > 1:
        for i, arg in enumerate(sys.argv[1:]):
            print_me( i, arg)
    elif USE_BUFFERED_INPUT:  # Note: Do not use processing buffered inputs  
        for i, arg in enumerate(sys.stdin):
            print_me( i, arg)
    else:
        i=0
        #####  Need to deterime if the sys.stdin is empty.
        #####  if READLINE_EMPTY:
        #####      usage()
        while True:
            arg = sys.stdin.readline() #Blocks if no input
            if not arg:
                break
            print_me( i, arg)
            i += 1
    sys.exit(0)
4

3 に答える 3

5

grepオプションではない引数が 1 つ (パターン) あるため、このように機能します。例えば

$ grep < /dev/zero
Usage: grep [OPTION]... PATTERN [FILE]...
Try `grep --help' for more information.

stdin には無限の入力がありましたが、grep は必要な引数を取得できなかったため、不平を言いました。

オプションの引数のみを使用し、stdin が端末の場合にエラーを出力する場合は、file.isatty()を参照してください。

于 2012-10-30T16:21:46.227 に答える
4
import sys,os
print os.fstat(sys.stdin.fileno()).st_size > 0

呼び出しスクリプト

c:\py_exp>peek_stdin.py < peek_stdin.py
True

c:\py_exp>peek_stdin.py
False
于 2012-10-30T16:27:10.120 に答える
0

getoptモジュールを確認したい場合があります。基本的な例:

import getopt
import sys

def main(argv):
    try:
        opts, args = getopt.getopt(argv, "has:f:") # "has:f:" are the arguments 
    except getopt.GetoptError:
        print "print usage()"
        sys.exit(1)
    if not opts and not args:
        print "print usage()"
        sys.exit(1)

    print "args passed", opts, args
if __name__ == "__main__":
    main(sys.argv[1:])


~> python blabla.py
print usage()
~> python blabla.py -a arg
args passed [('-a', '')] ['arg']
~> python blabla.py -b as  ----> this fails because -b is not defined for getopt at second parameter
print usage()

これはどうですか:

#!/usr/bin/env python
import getopt
import sys
import select


def main(argv):
    try:
        opts, args = getopt.getopt(argv, "has:f:") # "has:f:" are the arguments
    except getopt.GetoptError:
        print "print usage()"
        sys.exit(1)
    if not opts and not args:
        a, b, c = select.select([sys.stdin], [], [], 0.2)
        if a:
            itera = iter(a[0].readline, "")
            for line in itera:
                data = line.strip()
                print data
        else:
            print "print usage()"

    print "args passed", opts, args
if __name__ == "__main__":
    main(sys.argv[1:])

select.select は、データが来るかどうかを確認するのに役立ちます

:~> ./hebele.py 
print usage()
args passed [] []

:~> ping www.google.com | ./hebele.py 
PING www.google.com (173.194.67.105) 56(84) bytes of data.
64 bytes from blabla (173.194.67.105): icmp_seq=1 ttl=48 time=16.7 ms
64 bytes from blabla (173.194.67.105): icmp_seq=2 ttl=48 time=17.1 ms
64 bytes from blabla (173.194.67.105): icmp_seq=3 ttl=48 time=17.1 ms
^CTraceback (most recent call last):
  File "./hebele.py", line 25, in <module>
    main(sys.argv[1:])
  File "./hebele.py", line 17, in main
    for line in itera:
KeyboardInterrupt
:~> ls | ./hebele.py 
Aptana_Studio_3
Desktop
...
workspace
args passed [] []

:~> ./hebele.py -a bla
args passed [('-a', '')] ['bla']
:~> ./hebele.py sdfsdf sadf sdf
args passed [] ['sdfsdf', 'sadf', 'sdf']
于 2012-10-30T16:48:37.213 に答える