我很好奇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
程序?