Поскольку Python 3k вводит строгое различие между строками и байтами, аргументы командной строки в массиве sys.argv представлены в виде строк. Иногда необходимо рассматривать аргументы как байты, например при передаче пути, который не обязательно должен быть в какой-либо конкретной кодировке символов в Unix.
Давайте посмотрим на пример. Ниже приводится краткая программа Python 3k argv.py
:
import sys
print(sys.argv[1])
print(b'bytes')
Когда она выполняется как python3.1 argv.py français
, она дает ожидаемый результат:
français
b 'bytes'
Обратите внимание, что аргумент français находится в моей кодировке локали. Однако, когда мы передаем аргумент в другой кодировке, мы получаем ошибку: python3.1 argv.py `echo français | iconv -t latin1`
Traceback (most recent call last):
File "argv.py", line 3, in <module>
print(sys.argv[1])
UnicodeEncodeError: 'utf-8' codec can't encode character '\udce7' in position 4: surrogates not allowed
Как передать двоичные данные программе Python 3k через командную строку аргументы? Пример использования - передача пути к файлу пользователя, который использует другую локаль.