#python #makefile
#питон #создание файла #python #makefile
Вопрос:
Через некоторое время мне наконец удалось успешно установить python и pip и запустить их на своем компьютере, используя Visual Studio Code.
Я работаю в виртуальной среде на Python, и у нас есть Makefile
со следующим утверждением:
test:
source .env amp;amp; PYTHONPATH=. PY_ENV=testing py.test ${ARGS} --duration=20
Файл .env
находится в главном каталоге рядом с Makefile
. Он содержит некоторые переменные среды, необходимые для тестирования определенных API.
Когда я извлекаю строку из файла и запускаю ее в своем терминале, все работает нормально, и все тесты выполняются и т.д.
Однако, если я вызову следующее: make test
Я получаю эту ошибку:
$ make test
source .env amp;amp; PYTHONPATH=. PY_ENV=testing py.test --duration=20
/usr/bin/sh: line 0: source: .env: file not found
make: *** [test] Error 1
(venv)
Мне кажется, что при запуске этой команды изнутри Makefile
она не может видеть .env
файл, но понятия не имеет, как это решить.
Комментарии:
1. вы пробовали с
/full/path/to/.env
? В Linux вы также можете использоватьpwd
, чтобы увидеть, в каком каталоге он выполняется. Иls
чтобы посмотреть, какие файлы / папки доступны.
Ответ №1:
source
Команда не ищет файл в текущем рабочем каталоге. Как упоминалось в man source
:
Прочитайте и выполните команды из filename в текущей среде оболочки и верните статус завершения последней команды, выполненной из filename. Если имя файла не содержит косой черты, для поиска каталога, содержащего имя файла, используются имена файлов в PATH.
Измените путь к файлу следующим образом:
test:
source ./.env amp;amp; PYTHONPATH=. PY_ENV=testing py.test ${ARGS} --duration=20
Обратите внимание, что эта ошибка не возникает в версии bash < 4. Это связано с ошибкой реализации при запуске в режиме POSIX (что make
используется, поскольку его оболочка по умолчанию sh
, которая обычно bash --posix
используется). Правильное поведение впервые было упомянуто в документации bash-2.05 (редакция 28ef6c31, файл doc/bashref.info):
Когда Bash не находится в режиме POSIX, выполняется поиск в текущем каталоге, если имя файла не найдено в `$ PATH’.
Эти более старые версии выполняли поиск в текущем каталоге независимо от режима POSIX. Это было исправлено только в bash-4.0-rc1 (редакция 3185942a, файл general.c). Запуск git diff 3185942a~ 3185942a general.c
выводит этот раздел:
@@ -69,6 69,7 @@ posix_initialize (on)
if (on != 0)
{
interactive_comments = source_uses_path = expand_aliases = 1;
source_searches_cwd = 0;
}
Комментарии:
1. Спасибо, теперь он работает. Вы думаете, что это также вопрос ОС, поскольку все остальные на Mac используют этот файл, также внутри виртуальной среды python, и каким-то образом это работает для них?
2. Похоже, что macOS поставляется с bash-3.2, который имеет багги. Я добавил примечание, объясняющее разницу.