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
это
встроено по умолчанию
.
C | |
C++ | |
Go | |
Groovy | |
Java | |
JavaScript | |
PHP | |
Python | |
Ruby | |
.NET/C# | |
Thrift | |
Теория Программирования |