Python与sys.argv

60 投票
3 回答
225080 浏览
提问于 2025-04-15 12:11
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 程序名 参数,那么程序就会退出。

第二部分我想检查数据库是否存在。在这两个地方,我不太确定我写的 sys.argv 的方式是否正确,尤其是在错误输出方面。

3 个回答

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 的内容是什么。

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

撰写回答