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
Пример 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
это
встроено по умолчанию
.