Путь Python с не-латинским-1 PYTHONHOME

В моем случае я включил Python в свое приложение. Когда путь моего приложения содержит не-латинский-1 символ, Py_Initialize вызывает exit (1) внутри ( дополнительная информация позже ).

Поэтому я проверил, может ли это воспроизвести с помощью стандартного исполняемого файла интерпретатора.

Python-2.7.x на Windows, похоже, не работает, когда путь PYTHONHOME содержит символ за пределами латинской кодировки. Проблема в том, что сайт модуля не может быть найден и импортирован. Поскольку умлауты, похоже, работают, каково фактическое ограничение здесь? Поддерживается ли только латинский-1? Почему он работает на OSX?

C:\Users\ъ\Python27\python.exe // fails to start (KOI8-R) ^ C:\Users\ġ\Python27\python.exe // fails to start (latin-3) ^ C:\Users\ä\Python27\python.exe // works fine (latin-1) ^ 

Есть идеи?

Задний план:

Я еще не прошел код, но Python 2.6 и Python 2.7 также ведут себя по-другому, когда сайт недоступен. Py 2.6 просто печатает сообщение, Py 2.7 отклоняется для запуска.

 static void initsite(void) { PyObject *m; m = PyImport_ImportModule("site"); if (m == NULL) { ... // Python 2.7 and later exit(1); // Python 2.6 and prior PyFile_WriteString("'import site' failed; traceback:\n", f); } ... } 

Python 2.7 : https://github.com/enthought/Python-2.7.3/blob/master/Python/pythonrun.c#L725

Python 2.6 : https://github.com/python-git/python/blob/master/Python/pythonrun.c#L705

2 Solutions collect form web for “Путь Python с не-латинским-1 PYTHONHOME”

Я думаю, что проблема в том, что внутри Python2 обрабатывает все как байтовые строки в кодировке платформы, которая (в западной Европе) CP1252 является вариантом Latin-1. Поэтому не удивительно, что он не может правильно обработать путь PYTHONHOME, содержащий другие символы

Но, когда я был моложе, я привык к добрым 8.3 форматам файлов MS / DOS …

Я все еще вижу (и использую их) в окне Windows 7 с DIR /X в окне консоли (CMD.EXE). Этот формат использует только символы верхнего регистра ASCII и tilda ( ~ ), поэтому его можно использовать в качестве обходного пути: просто объявите путь 8.3 в переменной окружения PYTHONHOME и запустите python с этим пулом 8.3.

BTW, рекомендуется, чтобы PYTHONHOME использовал путь, который не содержит никаких специальных символов, nore-пробелов. Он может работать, но это может вызвать проблемы с другими модулями

Взгляд на функцию PyImport_ImportModule версии 2.7 дает следующее определение:

 PyObject * PyImport_ImportModule(const char *name) { PyObject *pname; PyObject *result; pname = PyString_FromString(name); if (pname == NULL) return NULL; result = PyImport_Import(pname); Py_DECREF(pname); return result; } 

При просмотре функции PyImport_ImportModule версия 3.5 дает то же самое, кроме

 pname = PyUnicode_FromString(name); 

вместо

 pname = PyString_FromString(name); 

Вы можете посмотреть код для PyString_FromString и код для PyUnicode_FromString но кажется ясным, что python 2 не использует unicode и python 3, но я не смог найти, как / где именно это приводит к описанному вами поведению.

Функция PyImport_Import(module_name) (версия 2.7) использует только имя module_name :

 r = PyObject_CallFunction(import, "OOOOi", module_name, globals, globals, silly_list, 0, NULL); 

передавая ответственность …

  • Как вернуть только пользовательский путь в переменные окружения без доступа к реестру?
  • Ошибка импорта DLL Python при импорте vtk
  • Subprocess.call или Subprocess.Popen не могут использовать исполняемые файлы, которые находятся в PATH (Linux / Windows)
  • Windows назвала каналы на практике
  • Какой пользователь выполняет скрипты python, как в Windows?
  • охват замороженного исполняемого файла
  • Расширения Python для Win64 через GCC
  • Переподготовка Tensorflow в Windows
  • Python - лучший язык программирования в мире.