Функции virtualenvwrapper недоступны в сценариях оболочки
Итак, еще раз, я делаю приятную программу python, которая делает мою жизнь более легкой и экономит много времени. Конечно, это включает в себя virtualenv, выполненный с помощью функции mkvirtualenv
virtualenvwrapper. Проект имеет файл requirements.txt с несколькими требуемыми библиотеками (запросы тоже: D), и программа не будет работать без этих библиотек.
Я пытаюсь добавить исполняемую оболочку bin/run-app
script, которая была бы на моем пути (фактически символическая ссылка). Теперь, внутри этого script, мне нужно переключиться на virtualenv, прежде чем я смогу запустить эту программу. Поэтому я помещал это в
#!/bin/bash
# cd into the project directory
workon "$(cat .venv)"
python main.py
Файл .venv
содержит имя virtualenv. Но когда я запускаю этот script, я получаю ошибку workon: command not found
.
Конечно, у меня есть файл virtualenvwrapper.sh, полученный в моем bashrc, но он, похоже, не доступен в этой оболочке script.
Итак, как я могу получить доступ к этим функциям virtualenvwrapper? Или я делаю это неправильно? Как вы запускаете свои инструменты python, каждый из которых имеет свой собственный virtualenv!?
Ответы
Ответ 1
Просто введите virtualenvwrapper.sh
script в свой script, чтобы импортировать функции virtualenvwrapper. Затем вы можете использовать функцию workon
в script.
И, возможно, лучше создать оболочку script (вы могли бы назвать ее venv-run.sh
например), чтобы запустить любой Python script в заданный виртуальный файл и поместить его в /usr/bin
, /usr/local/bin
, или любой каталог, который находится в вашем PATH
.
Такой script может выглядеть так:
#!/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 not in your PATH
workon $1
python $2
deactivate
И может использоваться просто как venv-run.sh my_virtualenv /path/to/script.py
Ответ 2
Я не могу найти способ запускать команды virtualenvwrapper
в оболочке. Но этот трюк может помочь: возьмите свой env. name myenv
, затем введите следующие строки в начале скриптов:
ENV=myenv
source $WORKON_HOME/$ENV/bin/activate
Ответ 3
добавьте эти строки в ваш .bashrc или .bash_profile
export WORKON_HOME=~/Envs
source /usr/local/bin/virtualenvwrapper.sh
и снова откройте терминал и попробуйте
Ответ 4
Если вашему Python script требуется определенный virtualenv, тогда поместите/установите его в каталог virtualenv bin
. Если вам нужен доступ к этому script вне среды, вы можете сделать символическую ссылку.
main.py from virtualenv bin
:
#!/path/to/virtualenv/bin/python
import yourmodule
if __name__=="__main__":
yourmodule.main()
Symlink в вашей PATH:
pymain -> /path/to/virtualenv/bin/main.py
В bin/run-app:
#!/bin/sh
# cd into the project directory
pymain arg1 arg2 ...
Ответ 5
По-видимому, я делал это неправильно. Вместо сохранения имени virtualenv в файле .venv я должен помещать путь к каталогу virtualenv.
(cdvirtualenv && pwd) > .venv
и в bin/run-app
, я положил
source "$(cat .venv)/bin/activate"
python main.py
И yay!
Ответ 6
Вы также можете напрямую вызвать исполняемый файл virtualenv python. Сначала найдите путь к исполняемому файлу:
$ workon myenv
$ which python
/path/to/virtualenv/myenv/bin/python
Затем вызовите из оболочки script:
#!/bin/bash
/path/to/virtualenv/myenv/bin/python myscript.py
Ответ 7
Это известная проблема. В качестве обходного пути вы можете сделать содержимое функции script a и поместить его либо в ~/.bashrc
, либо ~/.profile
function run-app() {
workon "$(cat .venv)"
python main.py
}