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 или нет.
Ответы
Ответ 1
BTW вы можете передать сообщение об ошибке непосредственно в 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])
Ответ 2
В Python вы не можете просто вставлять произвольные выражения Python в литературные строки и подставлять значение строки. Вам нужно либо:
sys.stderr.write("Usage: " + sys.argv[0])
или
sys.stderr.write("Usage: %s" % sys.argv[0])
Кроме того, вы можете захотеть использовать следующий синтаксис print
(для Python раньше 3.x):
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])
Ответ 3
Я бы сделал это следующим образом:
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
должно быть.