7

我有一个紧迫的问题,涉及从 Unix 终端运行 Python 脚本时传递多个标准输入参数。考虑以下命令:

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

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

4

4 回答 4

5

我有理由确定标准输入标记可以解决问题:

cat file.txt | python3.1 prearg - postarg

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

于 2013-09-08T18:36:04.213 回答
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.
于 2014-05-26T05:21:55.727 回答
1

假设绝对需要将内容作为标准输入而不是文件路径传递,因为您的脚本位于 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

要运行此脚本,请执行

$ 猫 abc.txt | script.py -dothis 真

$ 回声“你好” | script.py -dothis 真

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

于 2017-04-28T12:28:50.897 回答
-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
于 2013-09-08T18:42:58.887 回答