Что лучший способ состоит в том, чтобы проанализировать параметры командной строки?

Вот простой пример

from pandas import DataFrame

# Create data set
d = {'Revenue':[100,111,222], 
     'Cost':[333,444,555]}
df = DataFrame(d)


# mask = Return True when the value in column "Revenue" is equal to 111
mask = df['Revenue'] == 111

print mask

# Result:
# 0    False
# 1     True
# 2    False
# Name: Revenue, dtype: bool


# Select * FROM df WHERE Revenue = 111
df[mask]

# Result:
#    Cost    Revenue
# 1  444     111
228
задан abccd 19 March 2018 в 13:35
поделиться

7 ответов

Этот ответ предлагает optparse, который подходит для более старых версий Python. Для Python 2.7 и выше, argparse замены optparse. См. этот ответ для получения дополнительной информации.

, Поскольку другие люди указали, Вы - более обеспеченное движение с optparse по getopt. getopt, в значительной степени непосредственное отображение стандарта getopt (3) библиотечные функции C, и не очень простой в использовании.

optparse, будучи более подробным, намного лучше структурирован и более прост расшириться позже.

Вот типичная строка для добавления опции к синтаксическому анализатору:

parser.add_option('-q', '--query',
            action="store", dest="query",
            help="query string", default="spam")

Это в значительной степени выступает за себя; во время обработки это примет-q или - запрос как опции, сохранит аргумент в атрибуте, названном запросом, и имеет значение по умолчанию, если Вы не определите его. Это также самодокументирует в этом, Вы объявляете аргумент справки (который будет использоваться, когда выполнено с-h/-справка), тут же с опцией.

Обычно Вы анализируете свои споры с:

options, args = parser.parse_args()

Это, по умолчанию, проанализирует стандартные аргументы, переданные сценарию (sys.argv [1:])

options.query будет тогда установлен на значение, которое Вы передали сценарию.

Вы создаете синтаксический анализатор просто путем выполнения

parser = optparse.OptionParser()

, Это все основы, в которых Вы нуждаетесь. Вот полный сценарий Python, который показывает это:

import optparse

parser = optparse.OptionParser()

parser.add_option('-q', '--query',
    action="store", dest="query",
    help="query string", default="spam")

options, args = parser.parse_args()

print 'Query string:', options.query

5 строк Python, которые показывают Вам основы.

Сохраняют его в sample.py и выполняют его однажды с [1 123]

python sample.py

и однажды с [1 124]

python sample.py --query myquery

Кроме того, Вы найдете, что optparse очень легко расширить. В одном из моих проектов я создал класс Команды, который позволяет, Вы к вложенному множеству подуправляете в дереве команды легко. Это использует optparse в большой степени для цепочечных команд вместе. Это не что-то, что я могу легко объяснить в нескольких строках, но не стесняться к [1 110] обзор вокруг в моем репозитории для основного класса, а также класс, который использует его и синтаксический анализатор опции

173
ответ дан Community 23 November 2019 в 03:44
поделиться

Я предпочитаю optparse getopt. Это очень декларативно: Вы говорите ему названия опций и эффектов, которые они должны иметь (например, устанавливая булево поле), и это вручает Вам, поддерживают словарь, заполненный согласно Вашим спецификациям.

http://docs.python.org/lib/module-optparse.html

3
ответ дан Chris Conway 23 November 2019 в 03:44
поделиться

Я думаю, что лучшим способом для больших проектов является optparse, но если Вы ищете простой способ, возможно , http://werkzeug.pocoo.org/documentation/script является чем-то для Вас.

from werkzeug import script

# actions go here
def action_foo(name=""):
    """action foo does foo"""
    pass

def action_bar(id=0, title="default title"):
    """action bar does bar"""
    pass

if __name__ == '__main__':
    script.run()

, Таким образом, в основном каждая функция action_* подвергнута командной строке, и хорошее сообщение справки сгенерировано бесплатно.

python foo.py 
usage: foo.py <action> [<options>]
       foo.py --help

actions:
  bar:
    action bar does bar

    --id                          integer   0
    --title                       string    default title

  foo:
    action foo does foo

    --name                        string
3
ответ дан Peter Hoffmann 23 November 2019 в 03:44
поделиться

Используйте optparse, который идет со стандартной библиотекой. Например:

#!/usr/bin/env python
import optparse

def main():
  p = optparse.OptionParser()
  p.add_option('--person', '-p', default="world")
  options, arguments = p.parse_args()
  print 'Hello %s' % options.person

if __name__ == '__main__':
  main()

Источник: Используя Python для создания инструментов командной строки UNIX

Однако с Python 2.7 optparse удерживается от использования, см.: , Почему использование argparse, а не optparse?

14
ответ дан Community 23 November 2019 в 03:44
поделиться

В значительной степени все используют , getopt

Здесь является примером кода для документа:

import getopt, sys

def main():
    try:
        opts, args = getopt.getopt(sys.argv[1:], "ho:v", ["help", "output="])
    except getopt.GetoptError:
        # print help information and exit:
        usage()
        sys.exit(2)
    output = None
    verbose = False
    for o, a in opts:
        if o == "-v":
            verbose = True
        if o in ("-h", "--help"):
            usage()
            sys.exit()
        if o in ("-o", "--output"):
            output = a

Так, одним словом, вот то, как это работает.

у Вас есть два типа опций. Те, кто получает аргументы и тех, кто точно так же, как переключатели.

sys.argv в значительной степени Ваш char** argv в C. Как в C Вы пропускаете первый элемент, который является названием Вашей программы и синтаксического анализа только аргументы: sys.argv[1:]

Getopt.getopt проанализирует его согласно правилу, которое Вы даете в аргументе.

"ho:v" здесь описывает короткие споры: -ONELETTER. : средства, что -o принимает один аргумент.

Наконец ["help", "output="] описывает длинные споры (--MORETHANONELETTER). =, после того, как произведено еще раз средства, которые производят, принимают аргументы.

результатом является список пары (опция, аргумент)

, Если опция не принимает аргумента (как [1 112] здесь) arg, часть является пустой строкой. Вы тогда обычно хотите циклично выполниться в этом списке и протестировать имя опции как в примере.

я надеюсь, что это помогло Вам.

15
ответ дан shuttle87 23 November 2019 в 03:44
поделиться

На всякий случай Вы, возможно, должны были бы, это может помочь, если Вам нужно к захват unicode аргументы на Win32 (2K, XP и т.д.):


from ctypes import *

def wmain(argc, argv):
    print argc
    for i in argv:
        print i
    return 0

def startup():
    size = c_int()
    ptr = windll.shell32.CommandLineToArgvW(windll.kernel32.GetCommandLineW(), byref(size))
    ref = c_wchar_p * size.value
    raw = ref.from_address(ptr)
    args = [arg for arg in raw]
    windll.kernel32.LocalFree(ptr)
    exit(wmain(len(args), args))
startup()
6
ответ дан Shadow2531 23 November 2019 в 03:44
поделиться

Новый модный способ - argparse по этим причинам. argparse> optparse> getopt

обновление: Начиная с py2.7 argparse является частью стандартной библиотеки, а optparse устарел.

37
ответ дан 23 November 2019 в 03:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: