[python, scons] аналог requre_once из PHP
* из разных скриптов иметь подгрузить ( == выполнить ) код из определенного файла (файл X.py путь к которому задаётся абсолютным путёмКурить модуль imp
* код из файла должен выполняться только один раз, не смотря на то, что "дёргать" его могут сколько угодно раз.В питоне импорт происходит всегда (если не выгружаешь) один раз
То есть для этого пункта ничего делать не надо
$ tail m*.py
==> m0.py <==
print "Module m0 loaded"
==> m1.py <==
import m0
==> m2.py <==
import m0
import m1
$ python m2.py
Module m0 loaded
Как передавать директорию - хз, может можно как-то узнать откуда загрузились. Навскидку не скажу
UPD
Можно попробовать через sys.modules вытащить путь, по которому нас загрузили.
Файлов много, и весят они много?
если уж уточнять - то это конфигурации для scons . Проблема заключается в том, что в базовой директории должен лежать конфиг, включающий в себя разные способы сбори, флаги и т.п.
в базовой директории присудствуют папки:
* inc - с глобальными хидерами, которые должны быть доступны всем
* src - в этой папке содержится куча под-проектов, в каждом из которых свой SConscript файл со специфичными настройками
При этом должна быть возможность прозрачно компилить все проекты (из базовой директории вызвать $ scons . либо же проекты по отдельности (из директории проекта $ scons . )
поэтому проблемы прозводительности не стоит. стоит только проблема удоства пользования. Как это сделать средставми scons я пока не нашёл
наверняка должна быть переменная запуска скунса, которая указывает где искать файлы основной конфигурации сборки
в cmake это, кажется, делается с флагом -С . не помню точно давно писал
Проблема заключается в том, что в базовой директории должен лежать конфиг, включающий в себя разные способы сбори, флаги и т.п.Для этого в scons придумали environment-ы и их export/import.
SConstruct в корне делает environment, настраивает его: tool-ы грузит, аргументы командной строки обрабатывает, флаги компиляции выставляет, экспортирует его, а дальше SConscript-ом инклудит SConstruct-ы проектов.
SConstruct-ы проектов импортируют environment, добавляют в него свои target-ы. В результате scons собирает всё, scons project1 собирает project1. При этом всё собирается с одинаковыми настройками.
Чтобы scons из поддиректории проекта собирал проект, наверное, можно допилить SConstruct-ы проектов, чтобы они определяли, что их вызывают напрямую, и правильно это обрабатывали.
import/export меня как раз и смутил тем, что в этом случае SConscript подпроектов будет подразумевать, что их уже откуда-то вызывают.
надо поппробовать как-то определить, есть переменная в import или нет. и если нет - подгрузить дополнительный скрипт конфигурации из корня.
я пытаюсь сконфигурировать environment, а затем вызвать с заданными настройками Sconscript:
env = DefaultEnvironment
env.Replace(CCLFAGS = '-DSOME')
env.VariantDir('dist1', 'src', 0)
env.SConscript('dist1/SConstruct')
Рутовый SConstruct:
env = DefaultEnvironment
env.Replace(CCLFAGS = '-DSOME')
VariantDir('dist2', 'src', 0)
SConscript('dist2/SConstruct', exports='env')
src/SConstruct
Import('env')
env.Program('program', Glob('*.cpp' LIBS=['log4cpp'])
а если рутовый SConstruct изменить так:
env = Environment(CCFLAGS = '-DSOME')
VariantDir('dist2', 'src', 0)
SConscript('dist2/SConstruct', exports='env')
то всё работает...
Оставить комментарий
oleg1331
нужно:* из разных скриптов иметь подгрузить ( == выполнить ) код из определенного файла (файл X.py путь к которому задаётся абсолютным путём
* при этом внутри этого дополнительного файла X.py должна быть возможность прочитать файлы из той же самой директории, в которой лежит X.py без знания абсолютного пути к нему
* код из файла должен выполняться только один раз, не смотря на то, что "дёргать" его могут сколько угодно раз.
я так понимаю, это нужно как-то экспериментировать с модулями/импортами
кто-нибудь подскажет, как это можно сделать?