Python与sys.argv
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])