Makefile в Windows 10 — файл не найден

#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, который имеет багги. Я добавил примечание, объясняющее разницу.