Функции virtualenvwrapper недоступны в сценариях оболочки - PullRequest
53 голосов
/ 24 сентября 2011

Итак, еще раз, я делаю хорошую программу на Python, которая делает мою жизнь еще проще и экономит много времени. Конечно, это включает в себя virtualenv, созданный с помощью функции mkvirtualenv virtualenvwrapper. В проекте есть файл require.txt с несколькими необходимыми библиотеками (запросы тоже: D), и программа не будет работать без этих библиотек.

Я пытаюсь добавить исполняемый скрипт оболочки bin/run-app, который будет в моем пути (фактически, символическая ссылка). Теперь внутри этого скрипта мне нужно переключиться на virtualenv, прежде чем я смогу запустить эту программу. Так что я положил это в

#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py

Файл .venv содержит имя virtualenv. Но когда я запускаю этот скрипт, я получаю workon: command not found ошибку.

Конечно, у меня есть файл virtualenvwrapper.sh в моем bashrc, но он не доступен в этом сценарии оболочки.

Итак, как мне получить доступ к этим функциям virtualenvwrapper здесь? Или я делаю это неправильно? Как вы запускаете свои инструменты Python, каждый из которых имеет свой собственный virtualenv!?

Ответы [ 7 ]

67 голосов
/ 24 сентября 2011

Просто поставьте скрипт virtualenvwrapper.sh в своем скрипте, чтобы импортировать функции virtualenvwrapper. После этого вы сможете использовать функцию workon в своем скрипте.

И, может быть, лучше, вы могли бы создать сценарий оболочки (например, вы могли бы назвать его venv-run.sh), чтобы запустить любой сценарий Python для заданного virtualenv и поместить его в /usr/bin, /usr/local/bin или любой каталог в вашем PATH.

Такой скрипт может выглядеть так:

#!/bin/sh
# if virtualenvwrapper.sh is in your PATH (i.e. installed with pip)
source `which virtualenvwrapper.sh`
#source /path/to/virtualenvwrapper.sh # if it's not in your PATH
workon $1
python $2
deactivate

И может использоваться просто как venv-run.sh my_virtualenv /path/to/script.py

8 голосов
/ 03 августа 2012

Я не могу найти способ запуска команд virtualenvwrapper в оболочке.Но этот трюк может помочь: примите ваше env.имя myenv, затем поместите следующие строки в начало сценария:

ENV=myenv
source $WORKON_HOME/$ENV/bin/activate
1 голос
/ 09 июня 2015

Это известная проблема .В качестве обходного пути вы можете сделать содержимое скрипта функцией и поместить его в ~/.bashrc или ~/.profile

function run-app() {
  workon "$(cat .venv)"
  python main.py
} 
0 голосов
/ 17 августа 2013

Вы также можете напрямую вызвать исполняемый файл virtualenv. Сначала найдите путь к исполняемому файлу:

$ workon myenv
$ which python
/path/to/virtualenv/myenv/bin/python

Затем вызовите из своего сценария оболочки:

#!/bin/bash

/path/to/virtualenv/myenv/bin/python myscript.py
0 голосов
/ 02 июля 2013

добавьте эти строки в ваш .bashrc или .bash_profile

export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh

и снова откройте свой терминал и попробуйте

0 голосов
/ 24 сентября 2011

Видимо, я делал это неправильно.Вместо того, чтобы сохранять имя virtualenv в файле .venv, я должен указать путь к каталогу virtualenv.

(cdvirtualenv && pwd) > .venv

, а в bin/run-app -

source "$(cat .venv)/bin/activate"
python main.py

И yay!

0 голосов
/ 24 сентября 2011

Если вашему скрипту Python требуется определенный virtualenv, поместите / установите его в каталог bin virtualenv.Если вам нужен доступ к этому сценарию за пределами среды, вы можете создать символическую ссылку.

main.py из bin:

#!/path/to/virtualenv/bin/python
import yourmodule

if __name__=="__main__":
   yourmodule.main()

символьной ссылки в вашем PATH:

pymain -> /path/to/virtualenv/bin/main.py

В bin / run-app:

#!/bin/sh
# cd into the project directory
pymain arg1 arg2 ...
...