2014-05-23 10 views
21

Sul mio sistema, ho diversi moduli installati più volte. Per fare un esempio, numpy 1.6.1 è installato nel percorso standard al /usr/lib/python2.7/dist-packages, e ho una versione aggiornata di numpy 1.8.0 installato presso /local/python/lib/python2.7/site-packages/.Python: selezionare una delle molteplici versioni di moduli installati

Il motivo per cui non può semplicemente rimuovere la vecchia versione è che non ho i permessi di cambiare nulla sul mio computer di lavoro. Ho comunque bisogno di usare la nuova versione di numpy.

Ho aggiunto /local/python/lib/python2.7/site-packages/ al mio PYTHONPATH. Sfortunatamente, questo non aiuta, poiché /usr/lib/python2.7/dist-packages viene inserito prima nel percorso e, pertanto, verrà caricato numpy 1.6.1. Ecco un esempio:

>>> import os 
>>> print os.environ['PYTHONPATH'] 
/local/python/lib/python2.7/site-packages 
>>> import pprint 
>>> import sys 
>>> pprint.pprint(sys.path) 
['', 
'/local/python/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-linux-x86_64.egg', 
'/local/python/lib/python2.7/site-packages/pyparsing-2.0.1-py2.7.egg', 
'~/.local/lib/python2.7/site-packages/setuptools-3.4.4-py2.7.egg', 
'~/.local/lib/python2.7/site-packages/mpldatacursor-0.5_dev-py2.7.egg', 
'/usr/lib/python2.7/dist-packages', 
'/local/python/lib/python2.7/site-packages', 
'/usr/lib/python2.7', 
..., 
'~/.local/lib/python2.7/dist-packages', 
...] 

Così, sembra che l'ordine di importazione è

  1. directory corrente
  2. uova da PYTHONPATH
  3. uova di percorso modulo locale (~/.local/lib/python2.7/site-packages/*.egg)
  4. System- ampio sentiero modulo (~/usr/lib/python2.7/dist-packages/)
  5. directory da PYTHONPATH
  6. percorsi intermedi (omesse per brevità)
  7. directory base di utenti (~/.local/lib/python2.7/site-packages/)

Il mio problema è che avrei avuto bisogno di mettere punto 5. ante componenti 3. e 4. per il mio codice per funzionare correttamente . In questo momento, se importare un modulo che è stato compilato contro numpy 1.8.0 dalla directory /local/*, e questo modulo importazioni NumPy, ci vorranno ancora numpy dalla directory /usr/* e non riescono.

ho aggirato questo problema mettendo qualcosa di simile nel mio script:

import sys 
sys.path.insert(0, '/local/python/lib/python2.7/site-packages/') 

In tal modo posso forzare Python per utilizzare l'ordine di importazione giusta, ma naturalmente questo non è una soluzione, dal momento che avrei per farlo in ogni singolo script.

+0

Nessuno ha un'idea o ci sono problemi con la mia domanda? Qualsiasi aiuto è apprezzato. – Jenny

+0

La vera soluzione al tuo problema è la tua [propria copia dei moduli di Python] (https://docs.python.org/2/install/index.html#alternate-installation). –

+0

Non vedo davvero come ciò possa essere d'aiuto, perché i moduli dalla base utente vengono importati * dopo * i moduli di quelli dalla base globale. Ho aggiornato la mia domanda per chiarezza. – Jenny

risposta

6

Oltre alle indicazioni già fornite nella sezione di commento, hai pensato di usare virtualenv? Questo ti darebbe un controllo preciso su ogni modulo che vuoi usare. Se non hai familiarità con virtualenv ti consigliamo di leggere la documentazione per avere un'idea di come funziona.

Puramente per esempio, è possibile installarlo e configurarlo, in questo modo (virtualenv-1.11.6 looks per essere la versione più recente al momento):

$ curl -O https://pypi.python.org/packages/source/v/virtualenv/virtualenv-1.11.6.tar.gz 
$ tar xvfz virtualenv-1.11.6.tar.gz 
$ cd virtualenv-1.11.6 
$ python virtualenv.py ../numpyvenv 
$ cd ../numpyvenv 
$ source ./bin/activate 
(numpyvenv) $ pip install numpy 
# downloads, compiles, and installs numpy into the virtual environemnt 
(numpyvenv) $ python 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import numpy 
>>> numpy.version.version 
'1.9.1' 
>>> quit() 
(numpyvenv) $ deactivate 
$ # the virtual environment has been deactivated 

Sopra, abbiamo creato un ambiente virtuale di nome " numpyvenv ", ha attivato l'ambiente, ha installato numpy, stampato la versione numpy (per mostrare che funziona), ha lasciato Python e ha disattivato l'ambiente. La prossima volta che attiverai l'ambiente, numpy sarà lì insieme a qualunque altro modulo tu installi. Si può incorrere in singhiozzo durante il tentativo, ma dovrebbe iniziare.

1

Ho avuto lo stesso problema su Debian Wheezy dopo aver installato l'ultimo modulo numpy con easy_install.

Il nuovo modulo numpy è stato installato in /usr/local/lib/python2.7/dist-packages/numpy mentre il vecchio modulo era in /usr/lib/pymodules/python2.7/numpy. Quando ho provato a importare il modulo numpy, è stata importata la versione precedente. E come dici tu, aggiungendo a PYTHONPATH il nuovo percorso del modulo non è d'aiuto, perché viene aggiunto nel sys.path al di sotto della voce precedente.

Il problema sembra essere in easy-install, perché crea un file easy-install.pth che importa /usr/lib/pymodules/python2.7 prima di ogni modulo locale.

per risolvere il problema ho appena modificare Ed il file /usr/local/lib/python2.7/dist-packages/easy-install.pth e commentare Ed fuori la linea /usr/lib/pymodules/python2.7 quindi questa linea verrà posizionata sotto nella sys.path.

2

Ho avuto questo problema su un Mac che stavo usando senza accesso di amministratore. La mia soluzione era la seguente:

  1. Trova la directory della versione numpy che si desidera utilizzare. Per me questo è stato /Library/Python/2.7/site-packages

  2. Creare un file ~/.startup.py e scegliere con PYTHONSTARTUP=~/.startup.py nel file .bashrc

  3. In .startup.py:

import sys

sys.path.insert(0,'/Library/Python/2.7/site-packages/') < --- importa questo PRIMA delle parti standard

import numpy

print("Importing numpy version"+numpy.__version__) < ---- ricordare che abbiamo cambiato la versione NumPy

Questo sembra funzionare bene per me. Spero possa essere d'aiuto.

+0

Non avevo letto correttamente la domanda originale, quindi ho capito che parte della mia soluzione è già stata suggerita nella domanda originale, scuse per questo –

Problemi correlati