Как получить доступ к аргументам командной строки в Nim?

Как я могу получить доступ к аргументам командной строки в Nim? Документация показывает только, как запустить скомпилированный код nim с аргументами командной строки (nim compile --run greetings.nim arg1 arg2), но мне не удалось найти, как использовать их значения в коде.

Может кто-нибудь мне помочь?

Большое спасибо!

4 ответа

Решение

Вот пример, который печатает количество аргументов и первый аргумент:

import os

echo paramCount(), " ", paramStr(1)

Лично я нахожу paramCount а также paramStr немного запутанно работать, потому что paramCount значение отличается от соглашений C (см. ссылки на документы).

К счастью, есть дополнительные удобные функции, которые не требуют соблюдения условных обозначений:

  • commandLineParams возвращает seq только параметров командной строки.
  • getAppFilename возвращает имя исполняемого файла (что такое argv[0] в мире C).

os.commandLineParams()возвращает последовательность аргументов командной строки, предоставленных программе.

os.quoteShellCommand(<openArray[string]>)принимает последовательность аргументов командной строки и превращает ее в одну строку с кавычками вокруг элементов, содержащих пробелы, чтобы строку можно было правильно проанализировать.

parseopt.initOptParser(<string>)берет полную строку командной строки и анализирует ее, возвращаяOptParserобъект.

parseopt.getopt(<OptParser>)это итератор, который выдает проанализированную информацию аргумента.

Вы можете комбинировать их для разбора входных аргументов программы:

      import std/[os, parseopt]

proc writeHelp() = discard
proc writeVersion() = discard

var positionalArgs = newSeq[string]()
var directories = newSeq[string]()

var optparser = initOptParser(quoteShellCommand(commandLineParams()))
for kind, key, val in optparser.getopt():
  case kind
  of cmdArgument:
    positionalArgs.add(key)
  of cmdLongOption, cmdShortOption:
    case key
    of "help", "h": writeHelp()
    of "version", "v": writeVersion()
    of "dir", "d":
      directories.add(val)
  of cmdEnd: assert(false) # cannot happen

echo "positionalArgs: ", positionalArgs
echo "directories: ", directories

Выполнение этого сnim c -r main.nim -d:foo --dir:bar dir1 dir2 dir3печатает:

      positionalArgs: @["dir1", "dir2", "dir3"]
directories: @["foo", "bar"]

Я не проверял, когда он был добавлен, но парсеопт мне кажется, по умолчанию и лучший способ для этого.

commandLineParamsнедоступен на Posix.

Другие вопросы по тегам