我正在python 2.7中编写game,并希望编写游戏开发环境的“bootstrap”脚本,然后调用shovel。如果未检测到virtualenvwrapper,我将使用virtualenv bootstrap solution。但是,如果检测到virtualenvwrapper ,我想改用它。
问题是virtualenvwrapper内联shell函数不是由我的引导脚本继承的。据我所知,这排除了运行“mkvirtualenv NotOrion”之类的东西。由于环境变量“VIRTUALENVWRAPPER_VIRTUALENV” 设置(在我的情况下,来自macports:/opt/local/bin/virtualenv-2.7
),我尝试直接使用它:
#!/usr/bin/env bash
# Name your first "bootstrap" environment:
ENV_NAME=NotOrion
# Options for your first environment:
ENV_OPTS='--no-site-packages --distribute'
unset PYTHONDONTWRITEBYTECODE
function create_virtualenvwrapper_venv {
echo "installing into virtualenvwrapper directory"
cd $WORKON_HOME
$VIRTUALENVWRAPPER_VIRTUALENV $ENV_OPTS $ENV_NAME
cd -
#mkvirtualenv $ENV_NAME
#workon $ENV_NAME
}
function create_standalone_venv {
# not run/snipped
}
if [ -z "$VIRTUALENVWRAPPER_VIRTUALENV" ]; then
create_standalone_venv
else
create_virtualenvwrapper_venv
fi
pip install shovel
shovel help
我的bootstrap脚本完成安装铲。但是,运行铲(例如最后一行)会产生警告:
/Users/me/.virtualenvs/NotOrion/bin/shovel:25: UserWarning: Module argparse was already imported from /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/argparse.pyc, but /Users/me/.virtualenvs/NotOrion/lib/python2.7/site-packages is being added to sys.path
import pkg_resources
# normal shovel output snipped
那么有可能以某种方式从脚本中调用“mkvirtualenv”吗?如果没有,我可以从我的脚本中运行具有相同效果但不产生警告的其他内容吗?
答案 0 :(得分:12)
您的脚本应该可以:
# 'which' will print absolute path to virtualenvwrapper.sh
source `which virtualenvwrapper.sh`
我将其用于某些部署脚本。
答案 1 :(得分:2)
似乎没有“标准”的方法来做到这一点。所以我手动查看了各种可能的地方。凌乱,但它似乎是唯一的方式:
function find_virtualenvwrapper {
# no consistent way to find 'virtualenvwrapper.sh', so try various methods
# is it directly available in the path?
virtualenvwrapper_path=$(which virtualenvwrapper.sh)
if [ $? -eq 0 ]; then
return
fi
# nope; how about something that looks like it in our path?
# http://stackoverflow.com/questions/948008/linux-command-to-list-all-available-commands-and-aliases
virtualenvwrapper_cmd=$(compgen -ac | grep -i 'virtualenvwrapper\.sh' | sort | uniq | head -1)
if [ -n "$virtualenvwrapper_cmd" ]; then
virtualenvwrapper_path=$(which $virtualenvwrapper_cmd)
if [ $? -eq 0 ]; then
return
fi
fi
# still not; Debubuntu puts it in /etc/bash_completion.d
virtualenvwrapper_path='/etc/bash_completion.d/virtualenvwrapper'
if [ -e "$virtualenvwrapper_path" ]; then
return
fi
# any other methods to find virtualenvwrapper can be added here
echo "unable to find virtualenvwrapper.sh or anything that looks like it"
exit 1
}