Я написал простое приложение wxPython, которое я упаковал с py2app, превратив его в автономный пакет .app с двойным щелчком, который я могу дать другим людям для запуска.
Мое приложение использует некоторые специфичные для локали настройки - в частности, оно хочет проанализировать даты в текстовой форме - поэтому оно позволяет пользователю указать, какую локаль использовать, и вызывает locale.getdefaultlocale (), чтобы предварительно заполнить этот выбор.
Я проверил это, запустив код Python напрямую (в Python, установленном системой, не упакованный), и он работал нормально, затем я упаковал его с py2app и протестировал получающееся автономное приложение с помощью "open dist / foo.app "И это работало нормально. Тогда я дал это кому-то еще, и они пожаловались, что это немедленно бросило исключение; Я попытался дважды щелкнуть мой .app в Finder, и вот, locale.getdefaultlocale () действительно возвращает None (исключение произошло из-за того, что я сделал вызов метода для этого объекта).
Я написал простое тестовое приложение, которое выдает дамп среды и значение locale.getdefaultlocale (), и запускал его в тех же 3 средах. Результаты:
- вызывать напрямую из терминала как "python envdump.py": выводит всю мою среду
- пакет с py2app, вызывается из терминала как "open dist / envdump.app": выводит всю мою среду
- вызвать тот же dist / envdump.app, открыв его из Finder: среда гораздо более ограничена, и да, locale.getdefaultlocale () возвращает (None, None), потому что LANG не установлен.
Полный список переменных среды, заданных Finder: ARGVZERO, Apple_PubSub_Socket_Render, COMMAND_MODE, DISPLAY, EXECUTABLEPAT, HOME, LOGNAME, PATH, PYTHONPATH, RESOURCEPATH, SHELL, SSH_AUTH_ING_XER_TEXT_SUS_TEX_SUS_TUS_SUS_TUS_TUSKTUSKTUSK
Я легко могу заставить свой код терпеть отсутствие LANG / locale.getdefaultlocale (), но я бы хотел как-то получить эту информацию.