sys.argv Python

Содержание
Введение
Пример
Необязательный аргумент
Пример 2
В других языках
Похожие статьи

Введение

Это статья про агрументы, которые передаются в скрипт извне. Например, из терминала.

Про обычные аргументы читайте статью *args, **kwargs

Пример

Чтобы передать аргументы в Python скрипт из командной строки нужно воспользоваться библиотекой sys

import sys

Далее каждый аргумент нужно принимать с помощью sys.argv

a = sys.argv[1]

Пример: скрипт add.py

import sys first = sys.argv[1] second = sys.argv[2] print(f"{first} + {second} = {first + second}")

python3 add.py topbicycle .ru

topbicycle + .ru = topbicycle.ru

Чтобы проделать то же самое с целыми числами - используем функцию int() так как даже если передать числа, они будут получены как строки.

import sys first = int(sys.argv[1]) second = int(sys.argv[2]) print(f"{first} + {second} = {first + second}")

python3 add.py 3 4

3 + 4 = 7

Необязательный аргумент

Если нужно сохранить возможность не передавать никаких аргументов - можно добавить проверку длинны sys.argv

import sys if len(sys.argv) == 2: a = sys.argv[1] else: a = "default" print("a =", a) print(type(a))

python sysargs.py 2

a = 2 <class 'str'>

python sysargs.py

a = default <class 'str'>

Пример 2

Рассмотрим скрипт words.py из курса от Pluralsight

import sys from urllib.request import urlopen def fetch_words(url): # story = urlopen("http://sixty-north.com/c/t.txt") story = urlopen(url) story_words = [] for line in story: line_words = line.decode("utf8").split() for word in line_words: story_words.append(word) story.close() return story_words def print_words(story_words): for word in story_words: print(word) def main(): url = sys.argv[1] words = fetch_words(url) print_words(words) if __name__ == "__main__": main()

Этот скрипт не будет работать если не передать нужный url через терминал

python words3.py "http://sixty-north.com/c/t.txt"

Желательно также предусмотреть вызов функции main() после импорта.

В текущем виде будут проблемы

python

Python 3.9.5 (default, Jun 15 2021, 15:30:04) [GCC 9.3.0] on linux Type "help", "copyright", "credits" or "license" for more information.

>>> from words import *
>>> main()

Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/home/andrei/python/words.py", line 23, in main url = sys.argv[1] IndexError: list index out of range

>>> main("http://sixty-north.com/c/t.txt")

Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: main() takes 0 positional arguments but 1 was given

Решается проблема добавлением sys.argv[1] в вызов main

def main(url): words = fetch_words(url) print_words(words) if __name__ == "__main__": main(sys.argv[1])

В других языках

В C аналогичную функцию выполняет int argc, char* argv[]

В Bash это встроено по умолчанию .