Кодирование файла требований с использованием pip

В OSX (El Capitan, 10.11.6), используя virtualenv (15.1.0), я получаю сообщение об ошибке при установке требований из текстового файла с помощью pip (9.0.1):

virtualenv env
source env/bin/activate
pip install -r requirements.txt

но не при циклическом выполнении каждого требования вручную:

for r in $(cat requirements.txt); do pip install "$r"; done

Это заставляет меня думать, что может быть проблема с кодировкой по умолчанию, принятой pip при чтении файла требований. Есть ли способ (я полагаю, переменная среды), чтобы установить кодировку файлов требований по умолчанию?


Я получаю ошибку:

Exception:
Traceback (most recent call last):
  File "/path/to/env/lib/python2.7/site-packages/pip/basecommand.py", line 215, in main
    status = self.run(options, args)
  File "/path/to/env/lib/python2.7/site-packages/pip/commands/install.py", line 312, in run
    wheel_cache
  File "/path/to/env/lib/python2.7/site-packages/pip/basecommand.py", line 295, in populate_requirement_set
    wheel_cache=wheel_cache):
  File "/path/to/env/lib/python2.7/site-packages/pip/req/req_file.py", line 84, in parse_requirements
    filename, comes_from=comes_from, session=session
  File "/path/to/env/lib/python2.7/site-packages/pip/download.py", line 422, in get_file_content
    content = auto_decode(f.read())
  File "/path/to/env/lib/python2.7/site-packages/pip/utils/encoding.py", line 31, in auto_decode
    return data.decode(locale.getpreferredencoding(False))
LookupError: unknown encoding:

Следующий тестовый код:

#!/usr/bin/env python

import sys
import locale

print sys.stdin.encoding
print locale.getpreferredencoding()
print locale.getpreferredencoding(False)
print sys.getdefaultencoding()
print sys.getfilesystemencoding()

возвращает:

None

US-ASCII
ascii
utf-8

Из командной строки:

$ locale
LANG="en_GB.UTF-8"
LC_COLLATE="en_GB.UTF-8"
LC_CTYPE="utf-8"
LC_MESSAGES="en_GB.UTF-8"
LC_MONETARY="en_GB.UTF-8"
LC_NUMERIC="en_GB.UTF-8"
LC_TIME="en_GB.UTF-8"
LC_ALL=

1 ответ

Согласно вашему тесту locale.getpreferredencoding() отсутствует - это должно выглядеть так:

UTF-8
UTF-8
US-ASCII
ascii
utf-8

дела locale мой выглядит почти как ваш (кроме США против ГБ и LC_CTYPE). Это кажется странным, что LC_CTYPE кажется другим, и, возможно, стоит разобраться, почему.

$ locale
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL=

Есть несколько вещей, которые вы можете попытаться исправить, первым из которых является ваш шебанг:

#!/usr/bin/python

Попробуйте изменить это на это, возможно, как #!/usr/bin/env python может не правильно установить локаль. Если это не сработает, вы всегда можете попробовать применить кодировку в вашем скрипте:

import locale

loc = locale.getlocale()

locale.setlocale(locale.LC_ALL, '')   # use user's preferred locale
locale.setlocale(locale.LC_ALL, 'C')  # use default (C) locale
locale.setlocale(locale.LC_ALL, loc)  # restore saved locale

# OR

locale.getpreferredencoding(do_setlocale=True) or "utf-8"

# OR

if locale.getpreferredencoding() == '':
    locale.setlocale(locale.LC_ALL,'UTF-8')

В конечном итоге вы захотите выяснить, почему locale.getpreferredencoding() выходит пустым для первых пары тестов, и почему у вас несоответствие LC_CTYPE установить в вашем регионе.

Другие вопросы по тегам