Подтвердить что ты не робот

Функции 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!?

4b9b3361

Ответ 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
}