【问题标题】:How to read stdin in a script?如何在脚本中读取标准输入?
【发布时间】:2019-04-24 21:17:21
【问题描述】:
import sys

def optimal_summands(n):
    summands = []
    sum = n
    i = 0
    while (sum > 0):
        if 2*(i+1) < sum:
            i+=1
            summands.append(i)
            sum-=i
        else:
            summands.append(sum)
            sum=0
    return summands

if __name__ == '__main__':
    input = sys.stdin.read()
    n = int(input)
    summands = optimal_summands(n)
    print(len(summands))
    for x in summands:
        print(x, end=' ')

我在使用自己的输入运行此程序时遇到问题。我去我的终端并输入

(ykp) y9@Y9Acer:~/practice$ python optimal_summands.py 15

什么都没有发生。

我应该如何在自定义输入上运行我自己的代码?这看起来应该很简单,但我没有在文档中的任何地方看到如何执行此操作的示例。

【问题讨论】:

  • 15 是命令行参数,而不是标准输入。
  • 15 在您的情况下不在stdin 中,而是在argv 中。那个“什么都没有发生”可能是一个等待你输入的程序。
  • 你没有向进程的标准输入提供任何东西,所以sys.stdin.read() 将挂起,等待来自标准输入的 EOF
  • 如果我不能使用终端输入,那么 stdin 的意义何在?我如何向标准输入提供数据?

标签: python stdin


【解决方案1】:

我相信您可能会追求sys.argv 或更多功能,您可以选择argparse

使用sys.argv的示例

if __name__ == '__main__':
    filename = sys.argv[0]
    passed_args = map(int, sys.argv[1:]) # if you're expecting all args to be int.
    # python3 module.py 1 2 3
    # passed_args = [1, 2, 3]

使用argparse的示例

if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("n", type=int, help="Example help text here.")

    args = parser.parse_args()
    n = args.n
    print(isinstance(n, int)) # true

您也可以使用argparse为您的用户提供帮助,如下所示:

scratch.py$ python3 scratch.py -h
usage: scratch.py [-h] n

positional arguments:
  n           Example help text here.

optional arguments:
  -h, --help  show this help message and exit

以上不包括导入语句import sysimport argparseargparse 中的可选参数 以双连字符为前缀,下面是python 文档中所示的示例。

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("square", type=int,
                    help="display a square of a given number")
parser.add_argument("-v", "--verbose", action="store_true",
                    help="increase output verbosity")
args = parser.parse_args()
answer = args.square**2
if args.verbose:
    print("the square of {} equals {}".format(args.square, answer))
else:
    print(answer)

如果您只是希望通过 CLI 获得输入;你可以选择使用input_val = input('Question here')

【讨论】:

  • 谢谢。那么有没有办法让我使用sys.stdin.read() 做类似的事情?或者没有。
  • 没有。 - stackoverflow.com/questions/29454365/what-does-sys-stdin-read 给我的朋友读一读。
  • 所以似乎使用 sys.stdin.read(),我必须在运行 python optimal_summands.py 后输入我的参数,然后为 EOF 执行 CTRL+D(在 Linux 中)。跨度>
  • 通常sys.stdin.read 用于使用python3 script.py &lt; textfile.txt 之类的东西从文件中读取数据——这是我过去想出的唯一用例。尽管您可能想要使用类似:input('Number of summands you'd like to choose.') 的内容,它会要求用户在 CLI 中输入号码。
  • 太棒了——这非常有帮助。我在网上其他任何地方都找不到这个解释,这让我很震惊。
猜你喜欢
  • 2012-12-09
  • 2021-07-06
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多