2015-08-27 7 views
6

Mi piacerebbe configurare jupyter per permettermi di eseguire kernel python 2.7 e 3.4 contemporaneamente nello stesso momento in due quaderni diversi (o magari passare da uno all'altro in un unico notebook).(Come) Posso eseguire parallelamente i taccuini Python 2.7 e 3.4 in jupyter (ipython)?

(1) È possibile?

Mi chiedo poiché è stato suggerito in Using both Python 2.x and Python 3.x in IPython Notebook che ciò sarebbe possibile, ma non è stata fornita una risposta elaborata su come esattamente questo avrebbe funzionato.

Si può anche vedere in https://try.jupyter.org che in qualche modo sembra essere molto fattibile (e si può anche passare da un kernel Python 2 a un kernel Python 3). Quindi trovo ragionevole presumere che sia effettivamente possibile (ma per favore correggimi se sbaglio).

(2) Come è fatto?

risposte precedenti (per esempio in Open IPython Notebook 2.7 and 3.4 in Parallel) ha raccomandato di iniziare due diversi ipython server notebook in due differenti porte. Questo, ovviamente, è del tutto logico e possibile, ma lo NON risponde alla mia domanda.

sono riuscito a installare ipython per Python 2 & 3. Ho poi avuto entrambi i kernel di presentarsi in jupyter chiamando il seguente in ogni rispettivo ambiente python:

ipython kernelspec install-self

Questo ha creato kernel.json file per me e ora potevo selezionare uno di essi per creare un nuovo blocco appunti in jupyter. Esempio di kernel.json per Python 2:

{ 
"display_name": "Python 2", 
"language": "python", 
"argv": [ 
    "/usr/local/opt/python/bin/python2.7", 
    "-m", 
    "ipykernel", 
    "-f", 
    "{connection_file}" 
] 
} 

Il problema è che quando comincio jupyter da un ambiente python 2 (con $PYTHONPATH definito), posso essere eseguito solo un kernel Python 2 (l'altro sarà in crash quando si apre il quaderno corrispondente). Lo stesso, quando avvio jupyter da un ambiente python 3 (con $PYTHONPATH definito). Questo in genere ha senso per me, ma mi piacerebbe sapere come avviare o configurare jupyter per consentire l'esecuzione di entrambi i kernel dalla stessa istanza jupyter e specificare ancora il mio specifico $PYTHONPATH s per poter caricare i miei pacchetti.

Ho immaginato che questo fosse il mio problema reale: la predefinizione di $PYTHONPATH prima di iniziare jupyter. Così ho chiamato:

unset PYTHONPATH 
ipython notebook 

ora posso davvero eseguire entrambi i kernel (PY2 & 3) da una singola jupyter esempio, ma non riesco a caricare i pacchetti di Python da specifiche directory locali. Immagino di poterlo fare manualmente all'interno del notebook con:

import sys 
sys.path.append("/some/path/lib/python2.7/site-packages") 

ma è davvero questo il modo in cui dovrei farlo? oppure posso configurare ulteriori directory che normalmente scrivo in $PYTHONPATH da qualche altra parte (ad esempio, il file kernel.json?

PS: Si prega di non chiedere il motivo per cui ho bisogno di questo - no, non mi davvero bisogno - ma ho ancora vorrei sapere se e come questo potrebbe essere possibile.

[EDIT]

Si prega di notare che non sarebbe comodo l'installazione di alcuni utilità di gestione python (come Anaconda) per realizzare tutto questo, (a meno che non è l'unico modo).

+0

OK, ho risposto ad alcune delle mie domande iniziali lungo la strada, ma per favore fatemi sapere se potete dare una mano con la parte '$ PYTHONPATH' :) Grazie! – Chris

risposta

1

Ho Python 2 e 3 installati in Anaconda dove 3 è l'installazione principale e 2 è un'installazione dell'ambiente eseguita dopo l'installazione principale. Di default quando si esegue 'ipython notebook' esegue solo la versione di Python attiva nella shell in cui è stata avviata. Dopo aver eseguito 'ipython kernelspec install-self' quando Python2 era attivo e ancora quando Python3 era attivo, i kernel per entrambi sono disponibili in IPython Notebook indipendentemente dalla versione di Python attiva nella shell da cui è stata avviata.

Dato che "python2" è il nome del mio ambiente Python2, "activate env" è il comando anaconda per l'attivazione di un ambiente denominato "env" e "deactivate" è il comando per disattivare l'ambiente attualmente attivo (se presente) , i comandi che ho usato per attivare questa configurazione sono:

activate python2 
ipython kernelspec install-self 
deactivate 
ipython kernelspec install-self 

sys.path in IPython Notebook cambia dinamicamente ed opportunamente a seconda della versione di Python che attualmente gestisce. Quando si corre python2 lo sys.path è:

['', 'C:\\Users\\tn\\Documents\\python', 'C:\\Anaconda3\\envs\\python2\\python27.zip', 'C:\\Anaconda3\\envs\\python2\\DLLs', 'C:\\Anaconda3\\envs\\python2\\lib', 'C:\\Anaconda3\\envs\\python2\\lib\\plat-win', 'C:\\Anaconda3\\envs\\python2\\lib\\lib-tk', 'C:\\Anaconda3\\envs\\python2', 'C:\\Users\\tn\\AppData\\Roaming\\Python\\Python27\\site-packages', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\Sphinx-1.3.1-py2.7.egg', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\cryptography-0.9.1-py2.7-win-amd64.egg', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\win32', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\setuptools-18.1-py2.7.egg', 'C:\\Anaconda3\\envs\\python2\\lib\\site-packages\\IPython\\extensions'] 

Dopo commutando il kernel python3, sys.path diventa:

['', 'C:\\Users\\tn\\Documents\\python', 'C:\\Anaconda3\\python34.zip', 'C:\\Anaconda3\\DLLs', 'C:\\Anaconda3\\lib', 'C:\\Anaconda3', 'C:\\Anaconda3\\lib\\site-packages', 'C:\\Anaconda3\\lib\\site-packages\\Sphinx-1.3.1-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\cryptography-0.9.1-py3.4-win-amd64.egg', 'C:\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Anaconda3\\lib\\site-packages\\setuptools-18.1-py3.4.egg', 'C:\\Anaconda3\\lib\\site-packages\\IPython\\extensions'] 

PYTHONPATH = C: \ Users \ tn \ Documenti \ pitone è incluso in sys.path per entrambe le versioni di Python.

Per personalizzare sys.path in base alla versione di Python per IPython Notebook, è possibile utilizzare la variabile di ambiente PYTHONSTARTUP (Python2) (vedere anche PYTHONSTARTUP (Python3)). Questa variabile dovrebbe contenere uno script Python leggibile che verrà eseguito durante l'avvio della modalità interattiva. Per l'uso con entrambi Python 2 e 3 deve essere eseguibile da entrambi. Per esempio, in C: \ Users \ tn \ Documenti \ python ho creato il seguente script chiamato 'start' che determina la versione principale di Python eseguirla e aggiunge un percorso che termina in quello a sys.path:

import sys 
v = sys.version_info[0] 
if v == 2 or v == 3: 
    sys.path.append(r'C:\Users\tn\Documents\python' + '\\' + str(v)) 

Ora, al riavvio di IPython Notebook, con Python 2 sys.path [-1] è C: \ Users \ tn \ Documents \ python \ 2 mentre per Python 3 è C: \ Users \ tn \ Documents \ python \ 3.

+0

Grazie, darò un'occhiata a "PYTHONSTARTUP", ma probabilmente avrei dovuto dire che non sono (e non voglio) usare anaconda. – Chris

Problemi correlati