Python создает make-файл зависимостей - PullRequest
0 голосов
/ 09 октября 2018

У меня есть проект на основе Makefile и некоторые скрипты Python, которые создают файлы графиков, например (в моем Makefile)

plot.pdf: my_script.py
    python my_script.py -o $@

Обычно эти скрипты имеют зависимости от данных, например my_data.txt, поэтому я добавил это вмой Makefile

plot.pdf: my_script.py my_data.txt
    python my_script.py -o $@

Это очень громоздко, так как мне нужно синхронизировать Makefile и скрипт Python.Поэтому я переключился на экспорт правил Make из скрипта python:

plot.pdf: my_script.py
    python my_script.py -o $@ --make-mode

--make-mode напишет Makefile, в котором будет указана зависимость plot.pdf от my_data.txt.Мой Makefile настроен на источник всех этих автоматически сгенерированных Makefile.

Для поддержки инкрементных сборок, когда я меняю свой скрипт на python, я указал зависимость plot.pdf от my_script.py.Но my_script.py также зависит от других написанных мной скриптов на python.Если я изменю эти сценарии, например utils.py, мой файл plot.pdf не будет обновлен. Есть ли способ получить пути к файлам импортированных скриптов Python из Python, чтобы я мог добавить их в мой автоматически сгенерированный Makefile? Или вы можете порекомендовать альтернативный подход?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Это можно сделать одним способом, например, если бы я хотел узнать местоположение модуля os.

import os
path = os.path.abspath(os.__file__)
print (path)

path = os.path.dirname(os.__file__)
print (path)

Результаты

PS D:\Coding\pytest> python run.py
C:\Users\hassan\AppData\Local\Programs\Python\Python37-32\lib\os.py
C:\Users\hassan\AppData\Local\Programs\Python\Python37-32\lib
PS D:\Coding\pytest>
0 голосов
/ 09 октября 2018

Наконец я нашел ответ, который меня порадовал:

import sys
print('\n'.join(
     [modu.__file__ for modu in sys.modules.values() 
          if '__file__' in dir(modu) 
          and modu.__file__ is not None]
))

, который содержит как системные скрипты Python , так и мои пользовательские скрипты.

0 голосов
/ 09 октября 2018

Каждый импортированный скрипт Python становится доступным как модуль.Этот модуль предоставляет атрибут __file__, который содержит имя файла сценария:

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