【问题标题】:python and sys.argvpython 和 sys.argv
【发布时间】:2009-06-11 19:42:30
【问题描述】:
if len(sys.argv) < 2:
    sys.stderr.write('Usage: sys.argv[0] ')
    sys.exit(1)


if not os.path.exists(sys.argv[1]):
    sys.stderr.write('ERROR: Database sys.argv[1] was not found!')
    sys.exit(1)

这是我正在处理的代码的一部分。第一部分我想说的是,如果用户不输入python programname something,那么它将退出。

我正在尝试查看数据库是否存在的第二部分。在这两个地方,我都不确定我是否有正确的方法通过 stderr 写出 sys.argv。

【问题讨论】:

  • 在您的第一个 if 块中执行 print 'Usage:' + sys.argv[0] 不会告诉用户他们需要输入“python [program_name] [something]”。它只打印“用法:[program_name]”。您可能想提出更好的错误消息。
  • 这应该被称为“python and sys.stderr”,虽然它实际上帮助了我argv:P
  • 完全一样的事情发生在我身上,@Cawas

标签: python


【解决方案1】:

顺便说一句,您可以将错误消息直接传递给 sys.exit:

if len(sys.argv) < 2:
    sys.exit('Usage: %s database-name' % sys.argv[0])

if not os.path.exists(sys.argv[1]):
    sys.exit('ERROR: Database %s was not found!' % sys.argv[1])

【讨论】:

    【解决方案2】:

    在 Python 中,您不能只是将任意 Python 表达式嵌入到文字字符串中,然后用它替换字符串的值。您需要:

    sys.stderr.write("Usage: " + sys.argv[0])
    

    sys.stderr.write("Usage: %s" % sys.argv[0])
    

    另外,您可能需要考虑使用print 的以下语法(适用于早于 3.x 的 Python):

    print >>sys.stderr, "Usage:", sys.argv[0]
    

    使用print 可以使代码更易于阅读。 Python 会自动在print 语句的参数之间添加一个空格,因此上例中的冒号后面会有一个空格。

    在 Python 3.x 中,您将使用 print 函数:

    print("Usage:", sys.argv[0], file=sys.stderr)
    

    最后,在 Python 2.6 及更高版本中,您可以使用.format

    print >>sys.stderr, "Usage: {0}".format(sys.argv[0])
    

    【讨论】:

    • 请注意,'Usage: {0}'.format(sys.argv[0]) 现在是格式化字符串的推荐方式。
    • 另请注意 sys.stderr.write() 不会添加尾随换行符,因此您应该明确包含一个。
    【解决方案3】:

    我会这样做:

    import sys
    
    def main(argv):
        if len(argv) < 2:
            sys.stderr.write("Usage: %s <database>" % (argv[0],))
            return 1
    
        if not os.path.exists(argv[1]):
            sys.stderr.write("ERROR: Database %r was not found!" % (argv[1],))
            return 1
    
    if __name__ == "__main__":
        sys.exit(main(sys.argv))
    

    这允许在需要时将main() 导入其他模块,并简化调试,因为您可以选择argv 应该是什么。

    【讨论】:

    • 这是一个很好的解释——我正在寻找更多关于使用 sys.exit( main(sys.argv) ) 以及为什么鼓励它的信息。谢谢你的解释。
    猜你喜欢
    • 2016-05-23
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    • 2021-11-18
    • 2017-08-17
    相关资源
    最近更新 更多