Fatal python error py initialize
Итак, в этой статье мы увидим, как мы можем решить фатальную ошибку python: py_initialize: не удается загрузить кодек файловой системы. Но перед этим мы посмотрим некоторые примеры кода и попытаемся выяснить, почему произошла ошибка. Итак, давайте начнем.
Пример кода
#include <Python.h>
int main (int, char**)
{
Py_Initialize ();
Py_Finalize ();
return 0;
}
Вывод:
Fatal Python error: Py_Initialize: unable to load the file system codec
LookupError: no codec search functions registered: can’t find encoding
Итак, поскольку возникла ошибка, мы можем сказать, что проблема заключается в инициализации Python в нашей программе. Компилятору C / C ++ не удается загрузить файл системного кодека для Python. Файл кодека отвечает за кодирование и декодирование нашей программы на python, и если компилятору это не удается, возникает данная ошибка. Теперь может быть несколько причин возникновения ошибки. Некоторые из них обсуждаются ниже:
- Системе не удается найти python, поскольку он недоступен в системных / переменных среды.
- Может быть доступно более одной версии python.
- Python неправильно установлен в системе.
Решение: изменение пути Python в переменных среды
Теперь, во всех вышеуказанных случаях, решение заключается в том, что вам нужно правильно установить Python и правильно указать путь к Python в системных / переменных среды. Для этого выполните следующие действия:
[ Для Windows 10]
Откройте систему, щелкнув правой кнопкой мыши на значке Windows.
Найдите env в строке поиска и выберите “Редактировать переменные системного окружения”.
Если для python существует какой-либо путь, вы можете удалить их, щелкнув путь, а затем выбрав удалить.
В противном случае выберите path и нажмите “Создать”, чтобы добавить “PythonPath” в системные переменные.
Таким образом, вы можете добавить путь python к переменным среды.
Исправление ошибки в Ubuntu или Debian
Вы также можете получить ошибку при работе с Debian или ubuntu. Причина, упомянутая выше, также следует и здесь. Однако решение для устранения проблемы в этом случае довольно простое. Вам нужно открыть терминал и выполнить следующую команду.
$ export PYTHONHOME=/usr/local/lib/python3.5/
$ export PYTHONPATH=/usr/local/lib/python3.5/
Исправление ошибки в macOS
Однако причина ошибки остается той же и для macOS, т. Е. Система не может найти Python, поскольку он недоступен в системных / переменных среды, или может быть доступно более одной версии python. Однако в macOS решение немного отличается от ОС Windows. В macOS вам нужно найти файл .bashrc или .bash_profile . В этот файл вы должны добавить следующую команду.
export PYTHONHOME=”/Users/<user>/python3/”
export PYTHONPATH=”${PYTHONHOME}/bin”
После завершения вы можете использовать следующую команду для установки переменных.
source .bashrc
Py_Initialize fails – unable to load the file system codec
Я пытаюсь собрать простой тестовый проект на c ++, который использует встроенный интерпретатор 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
Минимальный код:
#include <Python.h>
int main (int, char**)
{
Py_Initialize ();
Py_Finalize ();
0;
}
ОС – 32-разрядная Vista.
Используемая версия python – это отладочная сборка python 3.2, созданная из исходных текстов с использованием VC ++ 10.
python_d.exe файл из той же сборки запускается без каких-либо проблем.
Может кто-нибудь объяснить проблему и как ее исправить? Мой собственный google-fu меня подводит.
Ответ
Основная причина довольно проста: Python не находит свой каталог modules, поэтому он, конечноencodings, тоже не может загружаться
В документе Python о внедрении говорится: “Py_Initialize() вычисляет путь поиска модуля на основе его наилучшего предположения” … “В частности, он ищет каталог с именем lib/pythonX.Y”
Тем не менее, если модули установлены в (только) lib- относительно двоичного файла python – приведенное выше предположение неверно.
Хотя в документах говорится, что PYTHONHOMEи PYTHONPATHрассматриваются, мы заметили, что это не так; их фактическое присутствие или содержимое совершенно не имеет значения.
Единственное, что имело эффект, это вызов Py_SetPath()with, например[path-to]\lib, в качестве аргумента раньше Py_Initialize().
Конечно, это только вариант для сценария внедрения, в котором у пользователя есть прямой доступ и контроль над кодом; с готовым решением могут потребоваться специальные шаги для решения проблемы.