python и sys.argv - PullRequest
       11

python и sys.argv

58 голосов
/ 11 июня 2009
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 ]

96 голосов
/ 12 июня 2009

Кстати, вы можете передать сообщение об ошибке непосредственно в 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 голосов
/ 11 июня 2009

В 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])
31 голосов
/ 12 июня 2009

Я бы сделал это так:

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 должен быть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...