paquetes - Incrustar Python3 sin biblioteca estándar
lista de modulos de python (1)
EDITAR: He hecho una pregunta opuesta aquí: Cómo incrustar Python3 con la biblioteca estándar
Aquí se proporciona una solución para Python2: ¿es posible incrustar python sin la biblioteca estándar?
Sin embargo, Python3 falla en Py_Initialize();
con:
Fatal Python error: Py_Initialize: unable to load the file system
codec ImportError: No module named ''encodings''
Esto tiene sentido porque los archivos fuente py3 son utf-8 de forma predeterminada. Parece que requiere un binario externo solo para analizar los archivos fuente de py3.
¿Entonces lo que hay que hacer?
Parece que necesito ubicar las encodings
binarias en la instalación de Python de mi sistema, copiar esto en el árbol de mi proyecto y quizás establecer alguna variable de entorno PYTHONPATH (?) Para que mi libpython.dylib pueda encontrarlo.
¿Es posible evitar esto? Y si no, ¿alguien puede aclarar los pasos que debo seguir? ¿Habrá más contratiempos?
NOTA: Para la posteridad, así es como obtuve un libpython.dylib autónomo vinculándolo a mi proyecto en OSX:
Primero ubico mi sistema Biblioteca de Python: /usr/local/Frameworks/Python.framework/Versions/3.4/Python
(en mi caso fue instalado con homebrew).
Ahora yo:
Copie el .dylib en la carpeta de mi proyecto creando
./Libs/libpython3.4.1_OSX.dylib
Acceda a las
build settings -> linking
y establezcaother linker flags
a-lpython3.4.1_OSX
En este punto, parecerá que funciona. Sin embargo, si sabes intentar compilarlo en una nueva instalación de OSX, fallará. Esto es porque:
$ otool -D ./libpython3.4.1_OSX.dylib
./libpython3.4.1_OSX.dylib:
/usr/local/Frameworks/Python.framework/Versions/3.4/Python
El .dylib todavía se mantiene en su ubicación anterior. Es realmente extraño para mí que .dylib contenga un enlace a su ubicación, ya que cualquier cosa que lo use debe saber dónde está para poder invocarlo en primer lugar.
Podemos corregir esto con:
$ install_name_tool -id @rpath/libpython3.4.1_OSX.dylib libpython3.4.1_OSX.dylib
Pero también en nuestro proyecto Xcode debemos:
- Ir a las
build phases
. Agregue un paso decopy files
quelibpython3.4.1_OSX.dylib
aFrameworks
(ese es el lugar correcto para ponerlo). - Vaya a las
build settings -> linking
y establezca lasrunpath search paths
en@executable_path/../Frameworks/libpython3.4.1_OSX.dylib
a@executable_path/../Frameworks/libpython3.4.1_OSX.dylib
Finalmente necesito ir al edit scheme -> run -> arguments -> environment variables
y agregar PYTHONHOME
con valor ../Frameworks
Sospecho que para que esto funcione también necesitaré agregar un PYTHONPATH
Campo de golf:
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
¿Pueden ayudarme a comprender cómo funcionan las bibliotecas Mach-O en Mac Os X?
http://nshipster.com/launch-arguments-and-environment-variables/
Intenté esto y tardaría más tiempo de lo que desea invertir en incrustar Python 3 sin la biblioteca de Python.
Algunos módulos de la biblioteca son necesarios para ejecutar Python 3 y requeriría muchas modificaciones para que funcione sin ellos.