Невозможно активировать среду python venv из Makefile - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь активировать свою виртуальную среду с помощью команды Makefile, но у меня появляется ошибка при запуске ниже.

Команда

make env

Ошибка

Makefile:20: warning: overriding commands for target `make'
Makefile:17: warning: ignoring old commands for target `make'
source ../env/bin/activate
make: source: No such file or directory
make: *** [env] Error 1

Makefile

...
env:
    source ../env/bin/activate
  • Среда существует на один каталог выше каталога с Makefile.
  • Другие команды Makefile работают.
  • source ../env/bin/activate в командной строке работает.

Интересно, есть ли что-то особенное в Makefile, я не понимаю этого вызывает это сбой?

1 Ответ

1 голос
/ 11 марта 2020

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

env:
        . ../env/bin/activate     

Или определите переменную make SHELL, чтобы сказать /bin/bash, и она будет работать:

SHELL := /bin/bash
env:
        source ../env/bin/activate

Но, следующая вещь ... строка рецепта делает fork() свою собственную оболочку (среду) Таким образом, изменения, внесенные в один экземпляр оболочки (путем создания сценария), не влияют на следующий. Вы можете обойти это и создать только одну оболочку, объединив несколько команд рецептов в одну строку (экранируя новые строки и разделяя команды с помощью ; вместо:

env:
        . ../env/bin/activate ; \
        SOME_COMMAND

Но это по-прежнему эффективно только для команд которые являются частью этой единой командной строки.

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

...