Python中使用stdin的多个参数

时间:2013-09-08 17:53:25

标签: python pipe stdin eof variadic-functions

我有一个关于从Unix终端运行Python脚本时传递多个stdin参数的问题。 请考虑以下命令:

$ cat file.txt | python3.1 pythonfile.py

然后file.txt (通过“cat”命令访问)的内容将作为标准输入传递给python脚本。这样做很好(虽然更优雅的方式会很好)。但是现在我必须传递另一个参数,这个参数只是一个用作查询(以及后两个单词)的单词。但我无法找到如何正确地做到这一点,因为猫管会产生错误。并且您不能在Python中使用标准input(),因为它会导致EOF错误(您无法在Python中组合stdin和input()

4 个答案:

答案 0 :(得分:5)

我有理由相信stdin标记可以做到这一点:

cat file.txt | python3.1 prearg - postarg

更优雅的方法可能是将file.txt作为参数传递,然后打开并阅读它。

答案 1 :(得分:1)

argparse 模块可让您更灵活地使用命令行参数。

import argparse

parser = argparse.ArgumentParser(prog='uppercase')
parser.add_argument('-f','--filename',
                    help='Any text file will do.')                # filename arg
parser.add_argument('-u','--uppercase', action='store_true',
                    help='If set, all letters become uppercase.') # boolean arg
args = parser.parse_args()
if args.filename:                       # if a filename is supplied...
    print 'reading file...'
    f = open(args.filename).read()
    if args.uppercase:                  # and if boolean argument is given...
        print f.upper()                 # do your thing
    else:
        print f                         # or do nothing

else:
    parser.print_help()                 # or print help

因此,当你在没有参数的情况下运行时,你会得到:

/home/myuser$ python test.py
usage: uppercase [-h] [-f FILENAME] [-u]

optional arguments:
  -h, --help            show this help message and exit
  -f FILENAME, --filename FILENAME
                        Any text file will do.
  -u, --uppercase       If set, all letters become uppercase.

答案 2 :(得分:1)

让我们说绝对需要一个人将内容传递为stdin,而不是文件路径,因为你的脚本驻留在一个docker容器或其他东西中,但是你还有其他需要传递的参数...所以做这样的事情

import sys
import argparse

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument('-dothis', '--DoThis', help='True or False', required=True)
    # add as many such arguments as u want

    args = vars(parser.parse_args())

    if args['DoThis']=="True":
        content = ""
        for line in sys.stdin:
            content = content + line
        print "stdin - " + content

要运行此脚本,请执行

  

$ cat abc.txt | script.py -dothis True

     

$ echo"你好" | script.py -dothis True

变量内容将存储在管道左侧打印的任何内容,' |',您还可以提供脚本参数。

答案 3 :(得分:-1)

虽然史蒂夫巴恩斯的回答将起作用,但它并不是真正最“pythonic”的做事方式。更优雅的方法是使用sys参数并在脚本本身中打开并读取文件。这样您就不必管道文件的输出并找出解决方法,您只需将文件名作为另一个参数传递。

像(在python脚本中):

import sys

with open(sys.argv[1].strip) as f:
    file_contents = f.readlines()
    # Do basic transformations on file contents here
    transformed_file_contents = format(file_contents)

# Do the rest of your actions outside the with block, 
# this will allow the file to close and is the idiomatic 
# way to do this in python

所以(在命令行中):

python3.1 pythonfile.py file.txt postarg1 postarg2