python和sys.argv

Tyl*_*ler 59 python

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)
Run Code Online (Sandbox Code Playgroud)

这是我正在研究的代码的一部分.第一部分我试图说,如果用户没有输入,python programname something那么它将退出.

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

Mar*_*nas 97

顺便说一句,您可以将错误消息直接传递给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])
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 34

在Python中,您不能只将任意Python表达式嵌入到文字字符串中,并将其替换为字符串的值.你需要:

sys.stderr.write("Usage: " + sys.argv[0])
Run Code Online (Sandbox Code Playgroud)

要么

sys.stderr.write("Usage: %s" % sys.argv[0])
Run Code Online (Sandbox Code Playgroud)

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

print >>sys.stderr, "Usage:", sys.argv[0]
Run Code Online (Sandbox Code Playgroud)

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

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

print("Usage:", sys.argv[0], file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)

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

print >>sys.stderr, "Usage: {0}".format(sys.argv[0])
Run Code Online (Sandbox Code Playgroud)

  • 请注意,'Usage:{0}'.format(sys.argv [0])现在是格式化字符串的推荐方法. (9认同)
  • 另请注意,sys.stderr.write()不会添加尾随换行符,因此应明确包含一个. (4认同)

Joh*_*kin 31

我会这样做:

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))
Run Code Online (Sandbox Code Playgroud)

main()如果需要,这允许导入到其他模块中,并简化调试,因为您可以选择argv应该是什么.