2016-01-11 39 views
48

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 impostare other 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 passaggio copy files che copia libpython3.4.1_OSX.dylib a Frameworks (è il posto giusto per inserirlo).
  • Andate in build settings -> linking e impostare runpath 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/

+13

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. –

+0

'encodings' non è un programma. È un pacchetto Python – ppperry

+1

Prova a leggere l'origine del codice di avvio di py2app. Conosce molto su OS X e avvia Python. –

risposta

2

ho cercato questo e ci sarebbe voluto più tempo di quanto si vuole spendere per incorporare Python 3 senza la libreria Python.

Alcuni moduli della libreria sono necessari per l'esecuzione di Python 3 e ci vorranno molte modifiche perché funzioni senza di essi.

+0

non è affatto una buona risposta, nessuna spiegazione del perché qualsiasi cosa tu affermi, e una spiegazione delle discontinuità tra python 2.x che funziona per questo e python 3.x non funziona. – snb

+0

Python 3 ha attualmente diverse dipendenze hard coded come encodings.utf_8, encodings.latin_1, builtins, io. Importa i moduli durante l'inizializzazione. Questo non era il caso in Python 2. Non c'è molto altro da dire. – Alden