python and sys.argv

60
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]"。它只打印了 "Usage: [program_name]"。你可能需要想出一个更好的错误信息。 - ntownsend
3
虽然它实际上帮助了我在argv上,但应该将其称为“Python和sys.stderr”。 - cregox
我也遇到了完全相同的问题,@Cawas。 - Stedy
这里的问题是什么? - Karl Knechtel
3个回答

100

顺便提一下,您可以直接将错误消息传递给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])

34

在Python中,你不能仅仅将任意的Python表达式嵌入到字面字符串中并替换为字符串的值。你需要:

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

另外,如果你使用的是 Python 3.x 之前的版本,你可能需要考虑使用以下语法形式的 print

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])

9
请注意,'Usage: {0}'.format(sys.argv[0]) 现在是格式化字符串的推荐方法。 - Bastien Léonard
4
请注意,sys.stderr.write() 不会自动添加换行符,因此您需要明确地添加一个换行符。 - Marius Gedminas

32

我会这样做:

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) ) 以及为什么鼓励使用它的更多信息。感谢您的解释。 - Helen Neely

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接