Подтвердить что ты не робот

Ошибка Py_Initialize - невозможно загрузить кодек файловой системы

Я пытаюсь собрать простой тестовый проект С++, который использует python 3.2. Проект строит отлично, но Py_Initialize вызывает фатальную ошибку:

Fatal Python error: Py_Initialize: unable to load the file system codec
LookupError: no codec search functions registered: can't find encoding

Минимальный код:

#include <Python.h>

int main (int, char**)
{
  Py_Initialize ();
  Py_Finalize ();
  return 0;
}

ОС - 32-битная Vista.

Используемая версия python представляет собой сборку отладки python 3.2, построенную из источников с использованием VС++ 10.

Файл python_d.exe из одной и той же сборки работает без проблем.

Может ли кто-нибудь объяснить проблему и как ее исправить? Мой собственный google-fu не позволяет мне.

РЕДАКТИРОВАТЬ 1

После прохождения исходного кода python я обнаружил, что, как говорится в ошибке, никаких функций поиска кодеков не было. И codec_register, и PyCodec_Register как и должно быть. Это просто, что нигде в коде не вызывается любая из этих функций.

Я действительно не знаю, что это значит, поскольку я до сих пор не знаю, когда и откуда должны были быть вызваны эти функции. Код, который вызывает ошибку, полностью отсутствует в источнике моей другой сборки python (3.1.3).

РЕДАКТИРОВАТЬ 2

Отвечал на мой вопрос ниже.

4b9b3361

Ответ 1

Итак, по какой-то причине dll python не находит модуль кодирования. Похоже, что исполняемый файл python.exe находит это, потому что он имеет ожидаемый относительный путь. Изменяется путь поиска.

Причина всего этого? Не знаю, но, по крайней мере, это работает. Я очень подозреваю опечатку с моей стороны где-то, что обычно является причиной появления нечетных ошибок.

Ответ 2

Проверьте системные переменные PYTHONPATH и PYTHONHOME и убедитесь, что они не указывают на Python 2.x

http://bugs.python.org/issue11288

Ответ 3

Части этого были упомянуты ранее, но в двух словах это то, что работало для моей среды, где у меня есть несколько установок Python и моя настройка глобальной ОС, чтобы указать на другую установку, чем та, с которой я пытаюсь работать с при столкновении с проблемой.

Убедитесь, что ваша (локальная или глобальная) среда полностью настроена, чтобы указать на установку, с которой вы работаете, например, у вас есть две (или более) установки, скажем, python27 и python33 (извините, это пути к файлам Windows, но следующее должно быть справедливо и для эквивалентных путей в стиле UNIX, пожалуйста, сообщите мне обо всем, что мне не хватает здесь ( возможно, путь DLL может отличаться)):

C:\python27_x86

C:\python33_x64

Теперь, если вы намереваетесь работать с вашей установкой python33, но ваша глобальная среда указывает на python27, убедитесь, что вы обновляете среду как таковую (в то время как PATH и PYTHONHOME могут быть необязательными (например, если вы временно работаете в локальная оболочка)):

PATH="C:\python33_x64;%PATH%"

PYTHONPATH="C:\python33_x64\DLLs;C:\python33_x64\Lib;C:\python33_x64\Lib\site-packages"

PYTHONHOME=C:\python33_x64

Обратите внимание, что вам может понадобиться/хотите добавить любые другие пути библиотеки к вашему PYTHONPATH, если это требуется вашей средой разработки, но правильная настройка DLLs, Lib и site-packages является простой значение.

Надеюсь, что это поможет.

Ответ 4

Я просто столкнулся с одной и той же проблемой (той же версией Python, ОС, кодом и т.д.).

Вам просто нужно скопировать каталог Python Lib/в рабочий каталог программы (на VC это каталог, где находится .vcproj)

Ответ 5

Из python3k для запуска требуется модуль кодирования, который можно найти в каталоге PYTHONHOME\Lib. Фактически, API Py_Initialize() выполняет инициализацию и импортирует модуль кодирования. Убедитесь, что PYTHONHOME\Lib находится в sys.path и проверяет, существует ли код.

Ответ 6

Кажется, что что-то не так с сборкой релиза, либо не включало соответствующие кодеки, либо неверно идентифицировало кодек для использования в системных API. Поскольку исполняемый файл python_d работает, что он возвращает для os.getfsencoding()? (Используйте C API для вызова между вызовами Initialize/Finalize)

Ответ 7

У меня была эта проблема с python 3.5, anaconda 3, windows 7 32 bit. Я решил это, переместив файлы pythonX.lib и pythonX.dll в свой рабочий каталог и вызвав

Py_SetPythonHome(L"C:\\Path\\To\\My\\Python\\Installation");

перед инициализацией, чтобы найти нужные заголовки, где мой путь был "...\Anaconda3 \". Дополнительный шаг вызова Py_SetPythonHome был необходим для меня, иначе я получаю другие странные ошибки, когда файлы импорта python.

Ответ 8

Основная причина довольно проста: Python не находит каталог своих модулей, поэтому он может, конечно, не загружать encodings тоже

Python doc on Py_Initialize() говорит: " Py_Initialize() вычисляет путь поиска модуля на основе его наилучшего предположения"..."В частности, он ищет каталог с именем lib/pythonX.Y "

Тем не менее, если модули установлены в (просто) lib - относительно двоичного кода python - выше догадка неверна.

Хотя документы говорят, что PYTHONHOME и PYTHONPATH рассматриваются, мы заметили, что это не так; их фактическое присутствие или содержание было совершенно неуместным.

Единственное, что имело эффект, это вызов Py_SetPath() например, [path-to]\lib как аргумент перед Py_Initialize().

Уверен, что это всего лишь вариант для сценария внедрения, где есть прямой доступ и контроль над кодом; с готовым решением для решения проблемы могут потребоваться специальные шаги.

Ответ 9

В то же самое время пытается установить brew python3 в Mac OS! Проблема здесь в том, что в Mac OS homebrew ставит "настоящий" python на весь уровень глубже, чем вы думаете. Вы могли бы подумать о выходе из доморощенного, что

$ echo $PYTHONHOME
/usr/local/Cellar/python3/3.6.2/
$ echo $PYTHONPATH
/usr/local/Cellar/python3/3.6.2/bin

будет правильным, но при вызове $PYTHONPATH/python3 немедленно выйдет из строя с прерыванием 6 "не может найти кодировки". Это потому, что хотя этот PYTHONHOME выглядит как полная установка, имея bin, lib и т.д., Это НЕ настоящий Python, который находится в Mac Framework "Framework". Сделайте это:

PYTHONHOME=/usr/local/Cellar/python3/3.x.y/Frameworks/Python.framework/Versions/3.x
PYTHONPATH=$PYTHONHOME/bin

(подставляя соответственно номера версий), и он будет работать нормально.

Ответ 10

Для меня это произошло, когда я обновил Python 64 бит с 3.6.4 до 3.6.5. Он пропустил некоторую ошибку, например "не удалось извлечь python.dll. У вас есть разрешения".

Pycharm также не смог загрузить интерпретатор, хотя я перезагрузил его в настройках. Запуск команды python дал ту же ошибку, с и без режима администратора.

причина

Произошла ошибка при установке Python, включить папку в каталог установки python C:\Users\USERNAME\AppData\Local\Programs\Python\Python36

Переустановка Python также решает проблему. (Не удаление и установка)

Решение

Удалите Python и установите Python еще раз.

Поскольку запущенный установщик просто извлекал одинаковые файлы, исключая папку include

Ответ 11

В моих случаях для Windows, если у вас установлено несколько версий Python, если PYTHONPATH указывает на одну версию, другие не работают. Я обнаружил, что если вы просто удалите PYTHONPATH, все они работают нормально

Ответ 12

У меня возникла проблема и я занимался различными решениями, упомянутыми здесь. Поскольку я запускал свой проект из Visual Studio, по-видимому, мне нужно было установить путь среды в Visual Studio, а не в системный путь.

Добавление простого решения PYTHONHOME = PATH\TO\PYTHON\DIR в проектное решение \properties\environment решило проблему.