Скрипты virtualenvwrapper mkvirtualenv

Я пишу игру на python 2.7 и хочу написать сценарий "начальной загрузки" для разработки моей игры. среду, а затем вызовите shovel. Если virtualenvwrapper не обнаружен, я буду использовать решение для начальной загрузки virtualenv. Однако, если обнаружится виртуальная обертка, я хотел бы использовать ее вместо этого.

Проблема в том, что встроенные функции оболочки virtualenvwrapper не наследуются моим загрузочным скриптом. Насколько я знаю, это исключает запуск чего-то вроде "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

Мой загрузочный скрипт завершает установку shovel. Однако бегущая лопата (например, последняя строка) выдает предупреждения:

/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» из скрипта? Если нет, могу ли я запустить из своего скрипта что-то еще, что дает тот же эффект, но не выдает предупреждения?


person EdwardTeach    schedule 28.10.2012    source источник
comment
Точно такая же проблема, написание скрипта начальной загрузки. Спасибо!   -  person Nick Merrill    schedule 04.06.2013


Ответы (2)


Ваш скрипт должен уметь:

# 'which' will print absolute path to virtualenvwrapper.sh
source `which virtualenvwrapper.sh`

Я использую это для некоторых сценариев развертывания.

person Chris Adams    schedule 28.10.2012
comment
Кажется, что macports virtualenvwrapper не предоставляет virtualenvwrapper.sh. У него есть и другие варианты, такие как virtualenvwrapper.sh-2.7, так что, похоже, я не могу на это рассчитывать. - person EdwardTeach; 29.10.2012
comment
О да. Если вы используете MacPorts, вы застряли, имея дело со всеми неподдерживаемыми изменениями, которые они вносят. Это особенно раздражает, поскольку для этого нет причин — одна установка virtualenv может обрабатывать множество разных версий Python (у меня есть одна установка, используемая для Python 2.5, 2.6, 2.7, 3.2, 3.3, PyPy и Jython) - person Chris Adams; 30.10.2012
comment
Это помогло мне завершить мой загрузочный скрипт; Я вставлю недостающую часть выше и приму этот ответ. - person EdwardTeach; 15.11.2012

Кажется, не существует «стандартного» способа сделать это. Поэтому я вручную искал в различных вероятных местах. Грязный, но, похоже, это единственный способ:

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
}
person EdwardTeach    schedule 15.11.2012