2016-01-11 8 views
48

EDIT: Я спросил противостоящую вопрос здесь: How to embed Python3 with the standard libraryВставить Python3 без стандартной библиотеки

Раствор для python2 предоставляется здесь: Is it possible to embed python without the standard library?

Однако Python3 терпит неудачу на Py_Initialize(); с:

Fatal Python error: Py_Initialize: unable to load the file system 
codec ImportError: No module named 'encodings' 

Это имеет смысл, потому что исходные файлы py3 по умолчанию являются utf-8. Похоже, что для разбора исходных файлов py3 требуется внешний двоичный файл.

А что делать?

Похоже, что мне нужно найти двоичный файл encodings в моей системе Python, скопировать его в мое дерево проектов и, возможно, установить некоторую переменную среды PYTHONPATH (?) Чтобы мой libpython.dylib мог ее найти.

Можно ли избежать этого? А если нет, может кто-нибудь уточнить шаги, которые мне нужно предпринять? Будут ли еще икоты?


ПРИМЕЧАНИЕ: Для потомков, это, как я получил автономное libpython.dylib связи в мой проект на OSX:

Сначала я найти мою систему библиотеку Питона: /usr/local/Frameworks/Python.framework/Versions/3.4/Python (в моем случае это было установленный с доморощенным).

Сейчас:

  • Скопируйте .dylib в мою папку проекта, создающего ./Libs/libpython3.4.1_OSX.dylib

  • Перейти в build settings -> linking и установить other linker flags в -lpython3.4.1_OSX

На данный момент он появится работать. Однако, если вы знаете, что попытаетесь создать его на новой установке OSX, он потерпит неудачу. Это связано с тем, что:

$ otool -D ./libpython3.4.1_OSX.dylib 
./libpython3.4.1_OSX.dylib: 
/usr/local/Frameworks/Python.framework/Versions/3.4/Python 

The .dylib по-прежнему держится за свое старое местоположение. Для меня действительно странно, что .dylib содержит ссылку на его местоположение, поскольку все, что его использует, должно знать, где именно, чтобы вызвать его в первую очередь!

Мы можем исправить это с помощью:

$ install_name_tool -id @rpath/libpython3.4.1_OSX.dylib libpython3.4.1_OSX.dylib 

Но и в нашем проекте Xcode мы должны:

  • Перейти в build phases. Добавьте шаг copy files, который копирует libpython3.4.1_OSX.dylib в Frameworks (это подходящее место для размещения).
  • Перейти в build settings -> linking и установить runpath search paths в @executable_path/../Frameworks/libpython3.4.1_OSX.dylib

Наконец мне нужно пойти в edit scheme -> run -> arguments -> environment variables и добавить PYTHONHOME со значением ../Frameworks

Я подозреваю, что, чтобы получить эту работу, я также потребуется добавить PYTHONPATH

Ссылки:
https://mikeash.com/pyblog/friday-qa-2009-11-06-linking-and-install-names.html
http://qin.laya.com/tech_coding_help/dylib_linking.html
https://github.com/conda/conda-build/issues/279#issuecomment-67241554
Can you please help me understand how Mach-O libraries work in Mac Os X?
http://nshipster.com/launch-arguments-and-environment-variables/

+13

Я боюсь, что есть больше требований; например, импортирующие модули в основном обрабатываются пакетом 'importlib'. Я не думаю, что Python 3 можно лишить stdlib больше, по крайней мере, не имея хотя бы подмножества. –

+0

'encodings' - это не программа. Это пакет python. – ppperry

+1

Попробуйте прочитать источник кода запуска py2app. Он много знает о OS X и запускает python. –

ответ

2

Я попытался это, и это займет больше времени, чем вы хотите потратить, чтобы встроить Python 3 без библиотеки Python.

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

+0

Это не является хорошим ответом вообще, не объясняет, почему все, что вы заявляете, имеет место, и объяснение разрывов между python 2.x для этого и python 3.x не работает. – snb

+0

Python 3 в настоящее время имеет несколько жестко закодированных зависимостей, таких как encodings.utf_8, encodings.latin_1, builtins, io. Он импортирует модули во время инициализации. Это было не так в Python 2. Больше нечего сказать. – Alden

Смежные вопросы