2012-04-23 19 views
6

Tôi tò mò về những gì xảy ra dưới sự che chở của lệnh mkvirtualenv và vì vậy tôi đang cố gắng hiểu nó gọi như thế nào virtualenv.Điều gì nằm dưới sự che chở của lệnh `mkvirtualenv`?

Quả treo thấp nhất là tìm nơi chương trình virtualenv được đặt sau khi cài đặt và nơi chương trình mkvirtualenv được đặt sau khi cài đặt. Vì vậy: -

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 

Vì vậy, điều kỳ lạ tôi thấy ở đây là which mkvirtualenv không cho kết quả nào. Tại sao?

Đào hơn nữa, trong thư mục virtualenvwrapper sau khi cài đặt nó, tôi thấy file chỉ có 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 

Và tôi cho rằng lý do duy nhất tại sao mkvirtualenv bây giờ đã có trong thiết bị đầu cuối của tôi là vì tôi đã thêm trong một số source/opt/local/library/Frameworks/Python.framework/Versions/2.7/bin/virtualenvwrapper.sh. Vì vậy, trả lời câu hỏi tôi đã hỏi trước đó, điều này đơn giản chỉ vì mkvirtualenv được thể hiện dưới dạng hàm bash và có sẵn trong terminal của tôi vì tôi có virtualenvwrapper.sh trong các tệp .bashrc hoặc .bash_profile của mình.

Đào vào virtualenvwrapper.sh kịch bản, tôi thấy

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

Đây là nơi tôi không hiểu chưa - Tôi dường như không thấy bất kỳ tài liệu tham khảo trực tiếp đến virtualenv chức năng bash này. Vậy hàm bash này chính xác như thế nào mkvirtualenv truyền các đối số từ dòng lệnh (ví dụ: mkvirtualenv -p python2.7 --no-site-packages mynewproject) đến chương trình python virtualenv?

Trả lời

3

Vì vậy, đây là dòng thực hiện thủ thuật.

(
    [ -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 là trong thực tế vị trí của nơi chương trình virtualenv hiện cư trú.

Trong 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 giải quyết.

Các vấn đề liên quan