2012-04-23 11 views
6

Tengo curiosidad acerca de lo que sucede bajo el capó del comando mkvirtualenv, por lo que estoy tratando de entender cómo se llama al virtualenv.¿Qué pasa bajo el comando `mkvirtualenv`?

La fruta que cuelga más bajo es para encontrar dónde se encuentra el programa virtualenv después de la instalación y dónde se encuentra el programa mkvirtualenv después de la instalación. Por lo tanto: -

Calvins-MacBook-Pro.local ttys006 Mon Apr 23 12:31:07 |~| 
calvin$ which mkvirtualenv 
Calvins-MacBook-Pro.local ttys006 Mon Apr 23 12:31:10 |~| 
calvin$ which virtualenv 
/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv 

Así lo extraño que veo aquí es que which mkvirtualenv no da ningún resultado. ¿Por qué?

de excavación más lejos, en el directorio virtualenvwrapper después de instalarlo, veo los archivos sólo 3 Python: -

Calvins-MacBook-Pro.local ttys004 Mon Apr 23 12:28:05 |/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/virtualenvwrapper| 
calvin$ ls -la 
total 88 
drwxr-xr-x 8 root wheel 272 Apr 13 15:07 . 
drwxr-xr-x 29 root wheel 986 Apr 15 00:55 .. 
-rw-r--r-- 1 root wheel 5292 Apr 13 15:05 hook_loader.py 
-rw-r--r-- 1 root wheel 4810 Apr 13 15:07 hook_loader.pyc 
-rw-r--r-- 1 root wheel 1390 Apr 13 15:05 project.py 
-rw-r--r-- 1 root wheel 2615 Apr 13 15:07 project.pyc 
-rw-r--r-- 1 root wheel 7381 Apr 13 15:05 user_scripts.py 
-rw-r--r-- 1 root wheel 11472 Apr 13 15:07 user_scripts.pyc 

Y supongo que la única razón por la mkvirtualenv ya está disponible en mi terminal es porque he añadido en un source/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.sh. Así que al responder la pregunta que hice antes, esto es simplemente porque mkvirtualenv se expresa como una función bash y está disponible en mi terminal porque he obtenido virtualenvwrapper.sh en mis archivos .bashrc o .bash_profile.

Excavando en el guión virtualenvwrapper.sh, veo

# Create a new environment, in the WORKON_HOME. 
# 
# Usage: mkvirtualenv [options] ENVNAME 
# (where the options are passed directly to virtualenv) 
# 
function mkvirtualenv { 
    typeset -a in_args 
    typeset -a out_args 
    typeset -i i 
    typeset tst 
    typeset a 
    typeset envname 
    typeset requirements 
    typeset packages 

    in_args=("[email protected]") 

    if [ -n "$ZSH_VERSION" ] 
    then 
     i=1 
     tst="-le" 
    else 
     i=0 
     tst="-lt" 
    fi 
    while [ $i $tst $# ] 
    do 
     a="${in_args[$i]}" 
     # echo "arg $i : $a" 
     case "$a" in 
      -a) 
       i=$(($i + 1)); 
       project="${in_args[$i]}";; 
      -h) 
       mkvirtualenv_help; 
       return;; 
      -i) 
       i=$(($i + 1)); 
       packages="$packages ${in_args[$i]}";; 
      -r) 
       i=$(($i + 1)); 
       requirements="${in_args[$i]}";; 
      *) 
       if [ ${#out_args} -gt 0 ] 
       then 
        out_args=("${out_args[@]-}" "$a") 
       else 
        out_args=("$a") 
       fi;; 
     esac 
     i=$(($i + 1)) 
    done 

    set -- "${out_args[@]}" 

    eval "envname=\$$#" 
    virtualenvwrapper_verify_workon_home || return 1 
    virtualenvwrapper_verify_virtualenv || return 1 
    (
     [ -n "$ZSH_VERSION" ] && setopt SH_WORD_SPLIT 
     \cd "$WORKON_HOME" && 
     "$VIRTUALENVWRAPPER_VIRTUALENV" $VIRTUALENVWRAPPER_VIRTUALENV_ARGS "[email protected]" && 
     [ -d "$WORKON_HOME/$envname" ] && \ 
      virtualenvwrapper_run_hook "pre_mkvirtualenv" "$envname" 
    ) 
    typeset RC=$? 
    [ $RC -ne 0 ] && return $RC 

    # If they passed a help option or got an error from virtualenv, 
    # the environment won't exist. Use that to tell whether 
    # we should switch to the environment and run the hook. 
    [ ! -d "$WORKON_HOME/$envname" ] && return 0 

    # If they gave us a project directory, set it up now 
    # so the activate hooks can find it. 
    if [ ! -z "$project" ] 
    then 
     setvirtualenvproject "$WORKON_HOME/$envname" "$project" 
    fi 

    # Now activate the new environment 
    workon "$envname" 

    if [ ! -z "$requirements" ] 
    then 
     pip install -r "$requirements" 
    fi 

    for a in $packages 
    do 
     pip install $a 
    done 

    virtualenvwrapper_run_hook "post_mkvirtualenv" 
} 

Aquí es donde no entiendo todavía - no parece ver ninguna referencia directa a virtualenv en esta función bash. Entonces, ¿cómo exactamente esta función bash mkvirtualenv pasa los argumentos desde la línea de comandos (por ejemplo, mkvirtualenv -p python2.7 --no-site-packages mynewproject) al programa python virtualenv?

Respuesta

3

Así que esta es la línea que hace el truco.

(
    [ -n "$ZSH_VERSION" ] && setopt SH_WORD_SPLIT 
    \cd "$WORKON_HOME" && 
    "$VIRTUALENVWRAPPER_VIRTUALENV" $VIRTUALENVWRAPPER_VIRTUALENV_ARGS "[email protected]" && 
    [ -d "$WORKON_HOME/$envname" ] && \ 
     virtualenvwrapper_run_hook "pre_mkvirtualenv" "$envname" 
) 

$VIRTUALENVWRAPPER_VIRTUALENV es, de hecho, la ubicación de donde reside el programa actual virtualenv.

En terminal,

Calvins-MacBook-Pro.local ttys004 Mon Apr 23 13:24:14 |~| 
calvin$ which $VIRTUALENVWRAPPER_VIRTUALENV 
/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenv 

Mytsery resuelto.