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 programname something
затем он выйдет.
вторая часть я пытаюсь увидеть, если база данных существует. В обоих местах я не уверен, что у меня есть правильный способ выписать sys.argv от stderr или нет.
3 ответа:
кстати, вы можете передать сообщение об ошибке непосредственно в sys.выход:
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])
в Python вы не можете просто вставлять произвольные выражения Python в литеральные строки и заменять их значением строки. Вам нужно либо:
sys.stderr.write("Usage: " + sys.argv[0])
или
sys.stderr.write("Usage: %s" % sys.argv[0])
кроме того, вы можете рассмотреть возможность использования следующего синтаксиса
print >>sys.stderr, "Usage:", sys.argv[0]
используя
В Python 3.х, вы должны использовать
print("Usage:", sys.argv[0], file=sys.stderr)
наконец, в Python 2.6 и позже вы можете использовать
.format
:print >>sys.stderr, "Usage: {0}".format(sys.argv[0])
Я бы сделал это так:
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
должно быть.