sys.argv как байты в Python 3k

Поскольку 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 через командную строку аргументы? Пример использования - передача пути к файлу пользователя, который использует другую локаль.

8
задан agf 9 August 2011 в 04:28
поделиться