2009-06-11 14 views
56
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, тогда он выйдет.python и sys.argv

Вторая часть Я пытаюсь проверить, существует ли база данных. В обоих местах я не уверен, что у меня есть правильный способ написать sys.argv's stderr или нет.

+3

Это должно быть названо «питон и sys.stderr», Тхо это на самом деле помогли мне на 'argv': P – cregox

+0

Таже вещь произошла со мной, @Cawas – Stedy

+0

В вашем первом if-блоке, выполняющем печать '' Usage: '+ sys.argv [0] 'не сообщает пользователю, что им нужно ввести« python [program \ _name] [something] » , Он печатает только «Использование: [program \ _name]». Возможно, вы захотите создать более качественное сообщение об ошибке. – ntownsend

ответ

90

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

В 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]) 
+9

Обратите внимание, что 'Использование: {0}'. Format (sys.argv [0]) теперь является рекомендуемым способом форматирования строк. –

+0

Спасибо, добавил. –

+4

Также обратите внимание, что sys.stderr.write() не будет добавлять конечную строку новой строки, поэтому вы должны указать ее явно. –

30

Я хотел бы сделать это следующим образом:

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.

+0

Это приятное объяснение. Я искал дополнительную информацию об использовании sys.exit (main (sys.argv)) и почему его поощряли. Спасибо за объяснение. –

Смежные вопросы