我有一个关于从Unix终端运行Python脚本时传递多个stdin参数的问题。 请考虑以下命令:
$ cat file.txt | python3.1 pythonfile.py
然后file.txt
(通过“cat”命令访问)的内容将作为标准输入传递给python脚本。这样做很好(虽然更优雅的方式会很好)。但是现在我必须传递另一个参数,这个参数只是一个用作查询(以及后两个单词)的单词。但我无法找到如何正确地做到这一点,因为猫管会产生错误。并且您不能在Python中使用标准input()
,因为它会导致EOF错误(您无法在Python中组合stdin和input()
)。
答案 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