2012-04-23 3 views
6

mkvirtualenvコマンドのフードの下で何が起こっているのか不思議で、virtualenvの呼び出し方法を理解しようとしています。`mkvirtualenv`コマンドの何がうまくいっていますか?

最も低いハングアップは、インストール後にvirtualenvプログラムがどこにあるのか、インストール後にmkvirtualenvプログラムがある場所を示すことです。だから、: -

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 

だから私はここを参照してください奇妙なことは、which mkvirtualenvがどんな結果を与えないということです。どうして?

virtualenvwrapperディレクトリにインストールした後、私は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 

そして私は、私が追加したのでmkvirtualenvが私の端末で利用できるようになりました唯一の理由があると仮定source/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.shにあります。私が先に質問した質問に答えるには、mkvirtualenvはbash関数として表現されており、私の.bashrcまたは.bash_profileファイルにvirtualenvwrapper.shをソースしているので、私の端末で利用できるからです。 virtualenvwrapper.shスクリプトに掘り

、私はまだ理解していないところです

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

を参照してください - 私はこのbashの関数のvirtualenvへの直接の言及を見ていないように見えます。どのようにして正確にこのbash関数mkvirtualenvはコマンドラインからの引数(例えばmkvirtualenv -p python2.7 --no-site-packages mynewproject)をPython virtualenvプログラムに渡しますか?

答えて

3

これは、このトリックを行う行です。

(
    [ -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実際に現在virtualenvプログラムが存在する場所の位置です。端子In

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を解消します。

関連する問題