2012-04-23 14 views
6

Jestem ciekawy, co dzieje się pod maską polecenia mkvirtualenv, więc staram się zrozumieć, jak to nazywa virtualenv.Co kryje się pod maską komendy `mkvirtualenv`?

Najniższym wiszącym owocem jest rysunek, gdzie znajduje się program virtualenv po instalacji i gdzie znajduje się program mkvirtualenv po instalacji. Tak więc: -

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 

tak dziwne rzeczy widzę tutaj jest to, że which mkvirtualenv nie daje żadnego rezultatu. Czemu?

Kopiąc dalej, w katalogu virtualenvwrapper po zainstalowaniu go, widzę tylko pliki 3 Pythonie -

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 

I przypuszczam, że jedynym powodem, dla którego mkvirtualenv jest teraz dostępny w moim terminalu dlatego dodałem w source/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.sh. Odpowiadając na pytanie, które zadałem wcześniej, jest to po prostu dlatego, że mkvirtualenv jest wyrażany jako funkcja bash i jest dostępny w moim terminalu, ponieważ mam źródło virtualenvwrapper.sh w moich plikach .bashrc lub .bash_profile.

kopanie w skrypcie virtualenvwrapper.sh, widzę

# 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" 
} 

Oto gdzie ja jeszcze nie zrozumieć - nie wydają się zobaczyć żadnego bezpośredniego odniesienia do virtualenv w tej funkcji bash. Więc jak dokładnie ta funkcja bash mkvirtualenv przekazuje argumenty z wiersza poleceń (na przykład mkvirtualenv -p python2.7 --no-site-packages mynewproject) do programu python virtualenv?

Odpowiedz

3

To jest linia, która rozwiązuje problem.

(
    [ -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 jest w rzeczywistości położenie, gdzie znajduje się prąd virtualenv programu.

W terminalu

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 rozwiązany.

Powiązane problemy