2014-04-28 10 views
6

Io uso Jedi per il completamento automatico di Python in Emacs, ma non è una dipendenza del mio codice, quindi non voglio inserirlo nel mio requirements.txt. (Altri sviluppatori non può utilizzare un plug-in editor di Jedi, e non è certamente necessario quando schiero a Heroku.)È possibile rendere virtualenvs riconducibili ai pacchetti utente anziché ai pacchetti di sistema?

Ma Jedi devono essere disponibili dal mio virtualenv al fine di funzione, ovvero se non ci riesco

import jedi 

non funziona.

C'è un buon modo per installare Jedi utente globalmente tale che sia disponibile in tutte le mie virtualenvs?

ho penso quello che voglio è

  1. installare Jedi in ~/.local/lib/python2.7/site-packages/ con pip's --user flag, poi a
  2. creare il mio virtualenv usando l'equivalente di the --system-site-packages flag, ma per pacchetti utente invece di pacchetti di sistema .

La mia soluzione attuale è a pip install jedi in ciascuna delle mie virtualenvs. Quindi quando aggiungo nuove dipendenze I pip install foo, pip freeze > requirements.txt, rimuovi manualmente jedi e alcune altre cose dal file prima di eseguire il commit. Ovviamente, questo è dispendioso in termini di tempo e incline agli errori.

Qualcuno ha una soluzione migliore?

+0

Perché non lo si installa nei pacchetti globali del sito? Sarebbe anche utile sapere quale plugin Jedi per Emacs stai usando. –

+0

@DaveHalter, sto usando ['emacs-jedi'] (https://github.com/tkf/emacs-jedi) intalled [via MELPA] (https://github.com/milkypostman/melpa/blob/ master/ricette/jedi). Non installo Jedi globalmente e ripenso a questo perché non voglio che i miei virtualenv vedano nessuno dei tanti pacchetti globali che ho installato ... Se sono autonomi posso essere più sicuro di avere tutte le mie dipendenze elencate in 'requirements.txt'. – Chris

risposta

4

Quando virtuenvactivate s, cambia diverse variabili env, come PATH, PYTHONHOME, PS1, e così via, al punto binario pitone desiderato, biblioteca, ecc È possibile modificare lo script per cambiare PYTHONPATH di utilizzare il sito dell'utente -packages, ovvero ~/.local/lib/python2.7/site-packages ed eventualmente i pacchetti del tuo sito di sistema. Con questa impostazione, pip cerca la libreria in ambiente virtuale, quindi esegue il failover nei pacchetti del sito utente/di sistema. Nota che normalmente lo script di attivazione non cambia affatto PYTHONPATH.

Cioè, aggiungere le seguenti righe nel proprio virtual_env/bin/activate.

# in activate script 

    # in deactivate function 
    if [ -n "$_OLD_VIRTUAL_PYTHONPATH" ] ; then 
     PYTHONPATH="$_OLD_VIRTUAL_PYTHONPATH" 
     export PYTHONPATH 
     unset _OLD_VIRTUAL_PYTHONPATH 
    fi 

# in activate section 
if [ -n "$PYTHONPATH" ] ; then 
    _OLD_VIRTUAL_PYTHONPATH="$PYTHONPATH" 
    PYTHONPATH=$HOME/.local/lib/python2.7/site-packages:/usr/lib/python2.7/site-packages 
fi 
+0

Se la modifica proposta è duratura, potrei suggerire di apportare questa modifica al codice sorgente? https://github.com/pypa/virtualenv/blob/master/virtualenv_embedded/activate.sh Non ha valore per noi, che al momento dell'esecuzione del progetto siamo sempre in esecuzione su venv prima di attivare, reimpostare quelle sceneggiature. – macetw

Problemi correlati