2016-01-11 13 views
48

EDIT: Ich habe eine gegenüberliegende Frage hier gestellt: How to embed Python3 with the standard libraryEmbed Python3 ohne Standardbibliothek

Eine Lösung für Python2 finden Sie hier: Is it possible to embed python without the standard library?

schlägt jedoch fehl Python3 auf Py_Initialize(); mit:

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

Dies ist sinnvoll, weil py3-Quelldateien standardmäßig utf-8 sind. Es scheint also, dass es eine externe Binärdatei benötigt, nur um py3 Quelldateien zu analysieren.

Was also zu tun?

Es sieht aus, als ob ich brauche die encodings binär in meinem System Python-Installation, kopieren Sie diese in meinen Projektbaum zu suchen, und vielleicht einige Umgebungsvariable PYTHONPATH gesetzt (?), So dass meine libpython.dylib es finden können.

Ist es möglich, dies zu vermeiden? Und wenn nicht, kann mir jemand die Schritte erklären, die ich machen muss? Wird es noch Schluckauf geben?


HINWEIS: Für die Nachwelt ist dies, wie ich ein Stand-alone libpython.dylib Einbindung in mein Projekt auf OSX:

Zuerst habe ich mein System Python-Bibliothek finden: /usr/local/Frameworks/Python.framework/Versions/3.4/Python (in meinem Fall war es installiert mit Homebrew).

Jetzt I:

  • Kopie der .dylib in meinem Projektordner ./Libs/libpython3.4.1_OSX.dylib

  • Go in build settings -> linking Erstellen und setzen other linker flags zu -lpython3.4.1_OSX

An dieser Stelle erscheint arbeiten. Wenn Sie jedoch wissen, dass Sie versuchen, es auf einer neuen OSX-Installation zu erstellen, wird es fehlschlagen. Dies ist, weil:

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

Die .dylib hält immer noch an seinem alten Speicherort. Es ist wirklich seltsam für mich, dass die .dylib eine Verknüpfung zu ihrem Ort enthält, da alles, was sie benutzt, wissen muss, wo sie ist, um sie überhaupt aufzurufen!

Wir können dies korrigieren mit:

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

Aber dann auch in unserem Xcode-Projekt müssen wir:

  • in build phases gehen. Fügen Sie einen copy files Schritt hinzu, der libpython3.4.1_OSX.dylib zu Frameworks kopiert (das ist der richtige Platz, um es zu setzen).
  • Go in build settings -> linking und setzen runpath search paths zu @executable_path/../Frameworks/libpython3.4.1_OSX.dylib

Schließlich muss ich in edit scheme -> run -> arguments -> environment variables gehen und fügen Sie PYTHONHOME mit Wert ../Frameworks

Ich vermute, dass diese Arbeit bekommen werde ich auch eine PYTHONPATH

hinzufügen müssen

Links:
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

Ich fürchte, es gibt mehr Anforderungen; Der Import von Modulen wird zum großen Teil durch das Paket 'importlib' abgewickelt. Ich glaube nicht, dass Python 3 die stdlib nicht mehr entfernen kann, zumindest nicht ohne zumindest eine Teilmenge. –

+0

'encodings' ist kein Programm. Es ist ein Python-Paket – ppperry

+1

Versuchen Sie, die Quelle von Launcher-Code py2app zu lesen. Es weiß viel über OS X und Python zum Laufen bringen. –

Antwort

2

Ich habe dies versucht, und es würde mehr Zeit in Anspruch nehmen, als Sie Python verbringen möchten 3 ohne die Python-Bibliothek einbinden.

Einige Module in der Bibliothek sind notwendig, damit Python 3 ausgeführt werden kann und es würde viele Änderungen erfordern, damit es ohne sie funktioniert.

+0

This ist überhaupt keine gute Antwort, keine Erklärung, warum alles, was Sie sagen, der Fall ist, und eine Erklärung der Diskontinuitäten zwischen Python 2.x und Python 3.x funktioniert nicht. – snb

+0

Python 3 hat derzeit mehrere fest codierte Abhängigkeiten wie encodings.utf_8, encodings.latin_1, builtins, io. Es importiert die Module während der Initialisierung. Dies war in Python 2 nicht der Fall. Es gibt nicht viel zu sagen. – Alden