Как получить доступ к аргументам командной строки в 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.