2012-10-28 16 views
5

Sto scrivendo uno game in python 2.7 e voglio scrivere lo "bootstrap" dell'ambiente di sviluppo del mio gioco, quindi invocare shovel. Se virtualenvwrapper non viene rilevato, userò uno virtualenv bootstrap solution. Tuttavia se virtualenvwrapper è rilevato, vorrei invece usarlo.Scripting virtualenvwrapper mkvirtualenv

Il problema è che le funzioni di shell inline virtualenvwrapper non sono ereditate dal mio script di bootstrap. Per quanto ne so, questo esclude di eseguire qualcosa come "mkvirtualenv NotOrion". Dal momento che la variabile d'ambiente "VIRTUALENVWRAPPER_VIRTUALENV" è set (nel mio caso, da macports: /opt/local/bin/virtualenv-2.7), ho provato ad usarlo direttamente invece:

#!/usr/bin/env bash 

# Name your first "bootstrap" environment: 
ENV_NAME=NotOrion 
# Options for your first environment: 
ENV_OPTS='--no-site-packages --distribute' 

unset PYTHONDONTWRITEBYTECODE 

function create_virtualenvwrapper_venv { 
    echo "installing into virtualenvwrapper directory" 
    cd $WORKON_HOME 
    $VIRTUALENVWRAPPER_VIRTUALENV $ENV_OPTS $ENV_NAME 
    cd - 
    #mkvirtualenv $ENV_NAME 
    #workon $ENV_NAME 
} 

function create_standalone_venv { 
    # not run/snipped 
} 

if [ -z "$VIRTUALENVWRAPPER_VIRTUALENV" ]; then 
    create_standalone_venv 
else 
    create_virtualenvwrapper_venv 
fi 

pip install shovel 
shovel help 

Il mio script di bootstrap termina l'installazione di pala. Tuttavia in esecuzione pala (ad esempio, l'ultima riga) produce avvertimenti:

/Users/me/.virtualenvs/NotOrion/bin/shovel:25: UserWarning: Module argparse was already imported from /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.pyc, but /Users/me/.virtualenvs/NotOrion/lib/python2.7/site-packages is being added to sys.path 
import pkg_resources 
# normal shovel output snipped 

Quindi è possibile invocare in qualche modo "mkvirtualenv" da uno script? In caso contrario, posso eseguire qualcos'altro dal mio script che ha lo stesso effetto ma lo non produce gli avvisi??

+0

Stesso problema, scrivendo uno script di bootstrap. Grazie! – cloudrave

risposta

11

Lo script dovrebbe essere in grado di fare:

# 'which' will print absolute path to virtualenvwrapper.sh 
source `which virtualenvwrapper.sh` 

Io uso che per alcuni script di distribuzione.

+0

Sembra che macports virtualenvwrapper non fornisca "virtualenvwrapper.sh". Ha altre varianti come "virtualenvwrapper.sh-2.7", quindi sembra che non posso contare su questo. – EdwardTeach

+0

Ah, sì. Se usi MacPorts, sei un po 'bloccato con tutte le modifiche non supportate che fanno. Questo è particolarmente fastidioso dal momento che non c'è motivo per farlo - una singola installazione di virtualenv può gestire diverse versioni di Python (ho una singola installazione usata per Python 2.5, 2.6, 2.7, 3.2, 3.3, PyPy e Jython) –

+0

Questo mi ha fatto in pista per aver completato il mio script di bootstrap; Incollerò il pezzo mancante in alto e accetto questa risposta. – EdwardTeach

2

Non sembra essere un modo "standard" per farlo. Quindi ho cercato manualmente in vari posti probabili. Disordinato, ma sembra essere l'unico modo:

function find_virtualenvwrapper { 
    # no consistent way to find 'virtualenvwrapper.sh', so try various methods 
    # is it directly available in the path? 
    virtualenvwrapper_path=$(which virtualenvwrapper.sh) 
    if [ $? -eq 0 ]; then 
     return 
    fi 
    # nope; how about something that looks like it in our path? 
    # http://stackoverflow.com/questions/948008/linux-command-to-list-all-available-commands-and-aliases 
    virtualenvwrapper_cmd=$(compgen -ac | grep -i 'virtualenvwrapper\.sh' | sort | uniq | head -1) 
    if [ -n "$virtualenvwrapper_cmd" ]; then 
     virtualenvwrapper_path=$(which $virtualenvwrapper_cmd) 
     if [ $? -eq 0 ]; then 
     return 
     fi 
    fi 
    # still not; Debubuntu puts it in /etc/bash_completion.d 
    virtualenvwrapper_path='/etc/bash_completion.d/virtualenvwrapper' 
    if [ -e "$virtualenvwrapper_path" ]; then 
     return 
    fi 
    # any other methods to find virtualenvwrapper can be added here 
    echo "unable to find virtualenvwrapper.sh or anything that looks like it" 
    exit 1 
}