Вызов скрипта Python из make-файла в другом каталоге - PullRequest
0 голосов
/ 03 августа 2010

У меня есть make-файл, который вызывает скрипт Python, который находится в том же каталоге, что и make-файл.Это работает просто отлично.
В makefile # 1:

auto:
   ./myscript.py

Теперь у меня есть другой make-файл в другом каталоге, и я хочу вызвать первый make-файл из него.В makefile # 2:

target:
    cd $(DIR); $(MAKE) auto;

Проблема в том, что когда скрипт запускается, он работает так, как если бы он находился в том же каталоге, что и makefile # 2.В stdout я вижу «make [3]: Leaving directory» и путь к # 1 сразу после выполнения make и перед запуском скрипта.

По предложению я попытался изменить make-файл # 2 так, чтобы:

target:
    ( cd $DIR; $MAKE auto; )

но это интерпретируется как "cd IR; AKE auto".Когда я заменяю скобки вокруг DIR и MAKE, я получаю то же поведение, что и раньше.

Я попытался изменить скрипт python, заставив его предположить, что он находится в директории # 2 и указав путь к # 1,но поведение не меняется.

Что происходит и что мне делать?

Обновление : мой комментарий ниже испортил форматирование кода, поэтому оно здесь:

Я попробовал это и получил по сути то, что вы описываете.Может быть, это как-то связано с тем, что target auto вызывает файл "makefile.rules"?

auto: 
    @echo this is makefile \#1 making $@ in $(PWD)
    FLAG=1 $(MAKE) -f makefile.rules rulestargetA
    FLAG=2 $(MAKE) -f makefile.rules rulestargetB
    ./myscript.py

Я упустил этот факт для простоты, но теперь мне интересно.

Обновление 2 : я не понимаю, почему make-файлы не вызывают запуск myscript.py, как если бы он находился в каталоге, в котором он находится, но я пытался заставить скрипт работать правильно, даже когдавызывается из другого каталога.Он открывает пару подпроцессов, запускает исполняемый файл в каждом подпроцессе и сохраняет стандартный вывод из каждого подпроцесса в файлы.Подпроцесс Python.Popen передает текущий рабочий каталог, который будет по умолчанию вызываться из сценария, а не из того места, где он находится.Я добавил скрипт для передачи в жилой каталог как cwd в вызов Popen.Однако по какой-то причине, когда я запускаю myscript.py в своем собственном каталоге, он работает, но когда я вызываю его из другого места (из командной строки), он зависает в proc.communicate ().Я должен решить эту проблему с Python, но я все еще хотел бы знать, почему внешний make-файл не может вызвать этот скрипт из своего собственного каталога.

1 Ответ

0 голосов
/ 03 августа 2010

Это очень странно.Сначала простая часть:

target:
  ( cd $DIR; $MAKE auto; )

Здесь круглые скобки ничего не делают, и Make интерпретирует $DIR как $D, за которыми следуют буква «I» и буква «R».Поскольку переменная D не определена, это работает как 'IR'.То же самое для $MAKE.

Теперь о реальной проблеме.Как написано, make-файлы должны работать.И вы говорите, что он покидает каталог # 1 до того, как скрипт запустится?Все, что я могу предложить, - это сначала попробовать более простую задачу.Поместите это в Makefile # 1:

auto:
  @echo this is makefile \#1 making $@ in $(PWD)

А затем используйте Makefile # 2 для создания target.Это должно привести к

make[1]: Entering directory 'path-to-one'
this is makefile #1 making auto in path-to-one
make[1]: Leaving directory 'path-to-one'

Если это то, что написано, то в вашем сценарии есть что-то странное.Если ничего подобного не получается, вы вообще не можете получить Makefile # 1, и, возможно, ваш DIR не прав.Если он работает, но говорит, что он находится в каталоге # 2, то я думаю, что у вас есть другое правило, ссылающееся на Makefile # 1.Попробуйте эксперимент и дайте нам знать.

РЕДАКТИРОВАТЬ:
Ну, это, вероятно, объясняет, как он может покинуть каталог # 1 до запуска сценария.Я предлагаю вам закомментировать эти строки и посмотреть, если проблема все еще существует.Теперь об этом сценарии: что он делает и как узнать, где он работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...