Как использовать virtualenv в make файле

Я хочу выполнить несколько операций при работе с указанным virtualenv.

Например команда

make install

будет эквивалентно

source path/to/virtualenv/bin/activate
pip install -r requirements.txt

Возможно ли это?

Ответ 1

В make вы можете запустить команду shell как команду. В этой оболочке вы можете делать все, что можете, в оболочке, которую вы начали с comandline. Пример:

install:
    ( \
       source path/to/virtualenv/bin/activate; \
       pip install -r requirements.txt; \
    )

Внимание должно быть уделено ; и \.

Все между открытой и закрывающей скобками будет выполняться в одном экземпляре оболочки.

Ответ 2

Мне нравится использовать то, что работает только когда requirements.txt изменения:

venv: venv/bin/activate

venv/bin/activate: requirements.txt
    test -d venv || virtualenv venv
    . venv/bin/activate; pip install -Ur requirements.txt
    touch venv/bin/activate

test: venv
    . venv/bin/activate; nosetests project/test

clean:
    rm -rf venv
    find -iname "*.pyc" -delete

Ответ 3

Мне повезло с этим.

install:
    source ./path/to/bin/activate; \
    pip install -r requirements.txt; \

Ответ 4

Вы также можете использовать переменную окружения, называемую "VIRTUALENVWRAPPER_SCRIPT". Вот так:

install:
    ( \
       source $$VIRTUALENVWRAPPER_SCRIPT; \
       pip install -r requirements.txt; \
    )

Ответ 5

Обычно make запускает каждую команду в рецепте в другой подоболочке. Однако установка .ONESHELL: запустит все команды в рецепте в одной и той же подоболочке, что позволит вам активировать virtualenv и затем запускать команды внутри него.

Обратите внимание, что .ONESHELL: применяется ко всему Makefile, а не только к одному рецепту. Это может изменить поведение существующих команд, подробности о возможных ошибках в полной документации. Это не позволит вам активировать virtualenv для использования вне Makefile, так как команды все еще выполняются внутри подоболочки.

Справочная документация: https://www.gnu.org/software/make/manual/html_node/One-Shell.html.

Пример:

.ONESHELL:

.PHONY: install
install:
    source path/to/virtualenv/bin/activate
    pip install -r requirements.txt

Ответ 6

Это альтернативный способ запуска вещей, которые вы хотите запустить в virtualenv.

BIN=venv/bin/

install:
    $(BIN)pip install -r requirements.txt

run:
    $(BIN)python main.py

PS: это не активирует virtualenv, но делает дело. Надеюсь, вы найдете его чистым и полезным.

Ответ 7

Вы должны использовать это, это функционально для меня в данный момент.

report.ipynb : merged.ipynb
    ( bash -c "source ${HOME}/anaconda3/bin/activate py27; which -a python; \
        jupyter nbconvert \
        --to notebook \
        --ExecutePreprocessor.kernel_name=python2 \
        --ExecutePreprocessor.timeout=3000 \
        --execute merged.ipynb \
        --output=$< $<" )