EDIT: ho chiesto una domanda opposta qui: How to embed Python3 with the standard libraryEmbed python3 senza libreria standard
Una soluzione per python2 è fornito qui: Is it possible to embed python without the standard library?
Tuttavia, python3 fallisce su Py_Initialize();
con:
Fatal Python error: Py_Initialize: unable to load the file system
codec ImportError: No module named 'encodings'
Questo ha senso perché i file sorgente di py3 sono per impostazione predefinita utf-8. Quindi sembra che richieda un binario esterno solo per analizzare i file sorgente di py3.
Quindi cosa fare?
Sembra che sia necessario localizzare il binario encodings
nell'installazione Python del mio sistema, copiarlo nell'albero del progetto e magari impostare una variabile d'ambiente PYTHONPATH (?) In modo che il mio libpython.dylib possa trovarlo.
È possibile evitare questo? E se no, qualcuno può chiarire i passi che devo prendere? Ci saranno altri singhiozzi?
NOTA: per i posteri, questo è come ho ottenuto uno stand-alone libpython.dylib collega nel mio progetto su OSX:
prima individuare il proprio sistema bibliotecario di Python: /usr/local/Frameworks/Python.framework/Versions/3.4/Python
(nel mio caso è stato installato con homebrew).
Ora:
copia del .dylib nella mia cartella del progetto la creazione di
./Libs/libpython3.4.1_OSX.dylib
Andate in
build settings -> linking
e impostareother linker flags
al-lpython3.4.1_OSX
A questo punto apparirà lavorare. Tuttavia, se sai provare a crearlo su una nuova installazione OSX, fallirà. Questo perché:
$ otool -D ./libpython3.4.1_OSX.dylib
./libpython3.4.1_OSX.dylib:
/usr/local/Frameworks/Python.framework/Versions/3.4/Python
Il .dylib sta ancora trattenendo la sua vecchia posizione. È davvero strano per me che il .dylib contenga un link alla sua posizione, poiché qualsiasi cosa lo usi deve sapere dove si trova per poterlo invocare in primo luogo!
possiamo correggere questo con:
$ install_name_tool -id @rpath/libpython3.4.1_OSX.dylib libpython3.4.1_OSX.dylib
Ma poi anche nel nostro progetto Xcode dobbiamo:
- Andate in
build phases
. Aggiungi un passaggiocopy files
che copialibpython3.4.1_OSX.dylib
aFrameworks
(è il posto giusto per inserirlo). - Andate in
build settings -> linking
e impostarerunpath search paths
a@executable_path/../Frameworks/libpython3.4.1_OSX.dylib
Infine ho bisogno di andare in edit scheme -> run -> arguments -> environment variables
e aggiungere PYTHONHOME
con valore ../Frameworks
Ho il sospetto che per ottenere questo lavoro ho anche bisogno di aggiungere un PYTHONPATH
Collegamenti:
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/
Temo che ci siano più requisiti; l'importazione di moduli è in gran parte gestita dal pacchetto 'importlib', ad esempio. Non penso che Python 3 possa essere spogliato dello stdlib più, almeno non senza almeno un sottoinsieme. –
'encodings' non è un programma. È un pacchetto Python – ppperry
Prova a leggere l'origine del codice di avvio di py2app. Conosce molto su OS X e avvia Python. –