Како рашчланити аргументе командне линије у Питхон-у

Желите да покренете Питхон скрипте са аргументима командне линије? Научите како да рашчланите аргументе командне линије користећи модуле сис, гетопт и аргпарсе у Питхон-у.

У Питхон-у, када желите да прочитате кориснички унос, користићете функцију инпут(). Међутим, за неке апликације, можда ћете желети да проследите одређене аргументе док покрећете скрипту на командној линији.

У овом водичу ћемо научити како да покренемо Питхон скрипту са опцијама и аргументима на командној линији. Затим ћемо научити како да користимо Питхон-ове уграђене модуле за рашчлањивање таквих опција и аргумената.

Почнимо!

Разумевање сис.аргв у Питхон-у

Ако сте програмирали у Ц-у, знате да је један од најједноставнијих начина за прослеђивање аргумената програму преко командне линије. Да бисте то урадили, можете структурирати главну функцију овако:

#include<stdio.h>

int main(int argc, char **argv){
    //argc: argument count
    //argv: argument vector
    
    //do something on the args

    return 0;
}

Овде аргц означава број аргумената, а аргв означава вектор аргумената.

Покретање Питхон скрипти са аргументима командне линије

У Питхон-у можете покренути Питхон скрипту у командној линији користећи питхон3 филенаме.пи. Када то радите, такође можете да унесете произвољан број аргумената командне линије:

$ python3 filename.py arg1 arg2 ... argn

Модул сис пружа готову подршку за приступ и обраду ових аргумената командне линије. сис.аргв је листа свих аргумената командне линије које прослеђујемо када покренемо Питхон скрипту.

Ево примера где покрећемо маин.пи са аргументима командне линије:

$ python3 main.py hello world python script

Можемо да прођемо кроз вектор аргумената користећи једноставну за петљу и функцију набрајања:

# main.py

import sys

for idx, arg in enumerate(sys.argv):
    print(f"arg{idx}: {arg}")
# Output
arg0:main.py
arg1:hello
arg2:world
arg3:python
arg4:script

Видимо да је први аргумент (на индексу 0) име Питхон датотеке. А следећи аргументи почињу од индекса 1.

Ово је минимални радни програм који прихвата и обрађује аргументе командне линије. Међутим, видимо неке проблеме:

  • Како корисници програма знају које аргументе треба да унесу?
  • И шта представљају ови аргументи?

Ово није баш јасно. Да бисте ово решили, можете користити или гетопт или аргпарсе модуле. И то ћемо научити у наредним одељцима.✅

Рашчлањивање аргумента командне линије коришћењем Питхон-овог гетопт

Хајде да научимо како да рашчланимо аргументе командне линије користећи уграђени гетопт модул.

  Постоји ли ограничење неограниченог прекорачења у зеленој тачки?

Након увоза гетопт из гетопт модула, можете одредити аргументе за рашчлањивање и кратке опције и дуге опције за покретање скрипте. Морамо да рашчланимо све аргументе почевши од индекса 1 у сис.аргв. Дакле, део за рашчлањивање је сис.аргв[1:].

Овде ће нам требати низ поруке и име датотеке. Хајде да користимо м и ф као кратке опције, а поруку и датотеку као дугачке опције.

Али како да обезбедимо да одређена опција захтева аргумент?

  • У кратким опцијама, можете учинити да опција захтева аргумент додавањем двотачке (:) иза кратког назива опције.
  • Слично, у дугим опцијама, можете додати знак = после дуге опције. Можемо да ухватимо ове опције и њихове аргументе.

Ако их додамо, имаћемо следећи код у маин.пи:

# main.py

import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

Овде променљива оптс садржи опције и аргументе као листу торки. Сваки други позициони аргумент који проследимо биће сакупљен у променљивој аргс.

Можемо да унесемо поруку и име датотеке да бисмо покренули скрипту, а можемо користити или кратке или дугачке опције.

Покретањем маин.пи користећи дуге опције, имамо:

$ python3 main.py --message hello --file somefile.txt

Имамо опције и аргументе као тупле у променљивој оптс. Пошто нисмо пренели ниједан позициони аргумент, аргс је празна листа.

# Output
[("--message', 'hello'), ('--file', 'somefile.txt')]
[]

Исто тако, можемо користити и кратке опције као што је приказано:

$ python3 main.py -m hello -f somefile.txt
# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
[]

⚠ Кратку опцију -м у овом примеру не треба мешати са заставицом командне линије -м која се користи за покретање модула као главног модула када се покреће Питхон скрипта.

На пример, користићете питхон3 -м униттест маин.пи да покренете униттест као главни модул када покрећете маин.пи.

Споменули смо да ће сви остали позициони аргументи које проследимо бити сакупљени у променљивој аргс. Ево примера:

$ python3 main.py -m hello -f somefile.txt another_argument

Листа аргс садржи позициони аргумент анотхер_аргумент.

# Output
[('-m', 'hello'), ('-f', 'somefile.txt')]
['another_argument']

Овде оптс је листа торки. Тако да можемо да прођемо кроз њега, распакујемо тупле и извучемо аргументе који одговарају специфичним опцијама.

Али шта да радимо са именом датотеке и поруком након што обрадимо ове аргументе? Отворићемо датотеку у режиму писања и написати стринг поруке конвертован у велика слова у датотеку.

# main.py
import sys
from getopt import getopt

opts, args = getopt(sys.argv[1:],'m:f:',['message=","file="])

print(opts)
print(args)

for option, argument in opts:
    if option == "-m':
        message = argument
    if option == '-f':
        file = argument

with open(file,'w') as f:
    f.write(message.upper())

Покренимо маин.пи са кратким опцијама и аргументима командне линије.

$ python main.py -m hello -f thisfile.txt
[('-m', 'hello'), ('-f', 'thisfile.txt')]
[]

Након покретања маин.пи, можемо видети ‘тхисфиле.ткт’ у нашем радном директоријуму. Садржи стринг ‘здраво’ претворен у велика слова (‘ХЕЛЛО’).

$ ls
main.py  thisfile.txt
$ cat thisfile.txt
HELLO

Како рашчланити аргументе командне линије помоћу Аргпарсе-а

Модул аргпарсе, такође уграђен у Питхон стандардну библиотеку, пружа функционалност за рашчлањивање аргумената командне линије и прављење интерфејса командне линије.

  Креирајте информативне приручнике са ових 11 софтвера за упутства за употребу

Да бисмо рашчланили аргументе командне линије, увезимо класу АргументПарсер из модула аргпарсе. Овде смо инстанцирали арг_парсер, објекат АргументПарсер:

from argparse import ArgumentParser

arg_parser = ArgumentParser()

Затим бисмо желели да додамо два аргумента командне линије:

  • порука: стринг поруке и
  • датотека: назив датотеке са којом желимо да радимо.

Сада позивамо метод адд_аргумент() на арг_парсер да бисмо додали оба ова аргумента. У позиву методе адд_аргумент(), можете поставити помоћ на стринг (опис аргумента).

arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

До сада смо инстанцирали арг_парсер и додали аргументе командне линије. Када се програм покрене у командној линији, можете користити метод парсе_аргс() на арг_парсер да бисте добили вредности аргумената.

Овде хватамо простор имена аргумената у променљивој аргс. Дакле, можете користити аргс.аргумент_наме да добијете вредности аргумената.

Након што добијемо вредности аргумената, у датотеку пишемо стринг поруке са замењеним великим и малим словима (користећи метод стринга свапцасе()).

args = arg_parser.parse_args()

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

Стављајући све заједно, ево наше маин.пи датотеке:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('message',help='message string')
arg_parser.add_argument('file',help='filename')

args = arg_parser.parse_args()
print(args)

message = args.message
file = args.file

with open(file,'w') as f:
     f.write(message.swapcase())

Разумевање употребе аргумента командне линије

Да бисте разумели употребу аргумената при покретању маин.пи, можете користити опцију –хелп лонг као што је приказано:

$ python3 main.py --help
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

Не постоје опциони аргументи и и порука и датотека су обавезни позициони аргументи. Алтернативно, можете користити и кратку опцију -х:

$ python3 main.py -h
usage: main.py [-h] message file

positional arguments:
  message     message string
  file        filename

optional arguments:
  -h, --help  show this help message and exit

Као што се види, оба аргумента су подразумевано позициони аргументи. Дакле, ако не проследите један или више ових аргумената, наићи ћете на грешке.

Овде смо проследили позициони аргумент (Здраво) за стринг поруке, али нисмо дали никакву вредност за аргумент датотеке.

И добијамо грешку у којој се наводи да је аргумент датотеке обавезан.

$ python3 main.py Hello
usage: main.py [-h] message file
main.py: error: the following arguments are required: file

Када покренемо маин.пи са оба позициона аргумента, видимо да именски простор аргс садржи вредности аргумената.

$ python3 main.py Hello file1.txt
# Output
Namespace(file="file1.txt", message="Hello")

Сада, ако испитамо садржај садашњег радног директоријума, видимо да скрипта креира датотеку ‘филе1.ткт’:

$ ls
file1.txt  main.py

Оригинални низ поруке је ‘Здраво’; након замене случаја стринг поруке у датотеци ‘филе1.ткт’ је ‘здраво’.

$ cat file1.txt
hELLO

Како да аргументе командне линије учините опционим

Да бисте учинили ове аргументе командне линије опционим, можете да додате префикс имену аргумента са –.

  9 најпопуларнијих алата који се користе у агилном развоју софтвера [2023]

Хајде да изменимо маин.пи да бисмо и поруку и аргументе датотеке учинили опционим.

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

Пошто су аргументи командне линије оба опциона, можемо поставити подразумеване вредности за ове аргументе.

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

У овом тренутку, датотека маин.пи садржи следећи код:

# main.py

from argparse import ArgumentParser

arg_parser = ArgumentParser()
arg_parser.add_argument('--message',help='message string')
arg_parser.add_argument('--file',help='filename')

args = arg_parser.parse_args()
print(args)

if args.message and args.file:
    message = args.message
    file = args.file
else:
    message="Python3"
    file="myfile.txt"

with open(file,'w') as f:
     f.write(message.swapcase())

Ако проверимо употребу, видећемо да су и порука и датотека опциони аргументи. То значи да сада можете покренути маин.пи без оба ова аргумента.

$ python3 main.py --help
usage: main.py [-h] [--message MESSAGE] [--file FILE]

optional arguments:
  -h, --help         show this help message and exit
  --message MESSAGE  message string
  --file FILE        filename
$ python3 main.py

У простору имена аргумената и датотека и порука су Ништа.

# Output
Namespace(file=None, message=None)

Видимо да се користи подразумевано име датотеке и порука ‘мифиле.ткт’ и ‘Питхон3’. Датотека ‘мифиле.ткт’ је сада у радном директоријуму:

$ ls
file1.txt  main.py  myfile.txt

И садржи стринг ‘Питхон3’ са замењеним великим словима:

$ cat myfile.txt
pYTHON3

Такође можете користити и аргументе –мессаге и –филе да бисте наредбу учинили читљивијом.

$ python3 main.py --message Coding --file file2.txt
# Output
Namespace(file="file2.txt", message="Coding")

Видимо ‘филе2.ткт’ у радном директоријуму:

$ ls
file1.txt  file2.txt  main.py  myfile.txt

И садржи стринг ‘цодинг’ као што се очекивало.

$ cat file2.txt
cODING

Закључак

Ево резимеа онога што смо научили у овом водичу:

  • Слично програмском језику Ц, у Питхон-у можете приступити аргументима командне линије тако што ћете проћи кроз вектор аргумената сис.аргв. сис.аргв[0] је назив Питхон скрипте. Дакле, заинтересовани смо за рашчлањивање аргумената сис.аргв[1:].
  • Међутим, да бисте побољшали читљивост и да бисте могли да додате опције, можете користити модуле за гетопт и аргпарсе.
  • Можете користити гетопт модул да рашчланите листу аргумената командне линије почевши од индекса 1 до краја листе. Можете одредити и кратке и дуге опције.
  • Када опција узме аргумент, можете да наведете двотачку (:) и = после кратке опције и дуге опције, респективно.
  • Са Питхон-овим модулом аргпарсе, можете инстанцирати објекат АргументПарсер и користити метод адд_аргумент() да додате тражени позициони аргумент. Користите — испред имена аргумента да бисте га учинили опционим.
  • Да бисте преузели вредности аргумената командне линије, позовите метод парсе_аргс() на објекту АргументПарсер.

Затим научите како да извршите безбедно хеширање у Питхон-у.