【问题标题】:read from stdin python从标准输入 python 读取
【发布时间】:2015-07-05 11:42:03
【问题描述】:

我试图从第一个命令行参数中获取文件名输入,如果没有则从stdin 读取,但由于某种原因,我的if 语句似乎不起作用。我已经把它贴在下面了。任何帮助将不胜感激。

import sys


filename=sys.argv[1]

if filename==None:
   filename=sys.stdin.readlines()

【问题讨论】:

    标签: python command-line command-line-arguments stdin


    【解决方案1】:

    您应该在尝试索引之前检查sys.argv 的长度:

    import sys
    if len(sys.argv) > 1:
      filename=sys.argv[1]
    else:
      filename=sys.stdin.readline().strip()
    

    sys.argv 中的第一个元素始终是 python 脚本的文件名,因此是 > 1

    [编辑]

    扩展 fixxxer 关于is== 的回答:

    is 返回 True 如果比较的变量指向同一个对象。这适用于None,因为None 是一个单例。另一方面,== 返回 True 如果比较的变量相等,即它们可以指向两个不同(但相等)的对象,== 将产生 True

    【讨论】:

    • 通过将sys.stdin.readlines() 替换为sys.stdin.readline()。更新了我的答案。
    • 谢谢!最后一个问题,我在输入文件名后按回车键,/n 被 python 捕获。有没有办法确保不会发生这种情况?
    • 通过在用户输入上调用strip()。再次更新。
    【解决方案2】:

    两件事:

    1. 正如 EventLisle 所说,在继续之前检查 sys.argv 的大小。
    2. 检查变量是否为 None 的正确方法是:

      变量为无:

    你的代码可以这样构造:

    import sys
    
    if len(sys.argv[1]):
        filename=sys.argv[1]
        # do your thing
    else:
        print "list is empty"
    

    【讨论】:

      【解决方案3】:

      我想知道根据您的代码,流程永远不会到达 if 块,它会在 filename=sys.argv[1] 行中引发 IndexError 异常,所以您可以尝试以下代码

      import sys
      
      try:
         filename=sys.argv[1]
      except IndexError: 
         filename=sys.stdin.readlines()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-30
        • 2012-02-17
        • 2011-12-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-21
        相关资源
        最近更新 更多