[python, scons] аналог requre_once из PHP

oleg1331

нужно:
 * из разных скриптов иметь подгрузить ( == выполнить ) код из определенного файла (файл X.py путь к которому задаётся абсолютным путём
 * при этом внутри этого дополнительного файла X.py должна быть возможность прочитать файлы из той же самой директории, в которой лежит X.py без знания абсолютного пути к нему
 * код из файла должен выполняться только один раз, не смотря на то, что "дёргать" его могут сколько угодно раз.
я так понимаю, это нужно как-то экспериментировать с модулями/импортами
кто-нибудь подскажет, как это можно сделать?

conv3rsje

* из разных скриптов иметь подгрузить ( == выполнить ) код из определенного файла (файл 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 вытащить путь, по которому нас загрузили.

qwerqwrewqr

Файлов много, и весят они много?

oleg1331

нет. файлов не много, весят минимально.
если уж уточнять - то это конфигурации для scons . Проблема заключается в том, что в базовой директории должен лежать конфиг, включающий в себя разные способы сбори, флаги и т.п.
в базовой директории присудствуют папки:
* inc - с глобальными хидерами, которые должны быть доступны всем
* src - в этой папке содержится куча под-проектов, в каждом из которых свой SConscript файл со специфичными настройками
При этом должна быть возможность прозрачно компилить все проекты (из базовой директории вызвать $ scons . либо же проекты по отдельности (из директории проекта $ scons . )
поэтому проблемы прозводительности не стоит. стоит только проблема удоства пользования. Как это сделать средставми scons я пока не нашёл

qwerqwrewqr

у.. к сожалению с этой системой сборки не знаком
наверняка должна быть переменная запуска скунса, которая указывает где искать файлы основной конфигурации сборки
в cmake это, кажется, делается с флагом -С . не помню точно давно писал

oliver11

Проблема заключается в том, что в базовой директории должен лежать конфиг, включающий в себя разные способы сбори, флаги и т.п.
Для этого в scons придумали environment-ы и их export/import.
SConstruct в корне делает environment, настраивает его: tool-ы грузит, аргументы командной строки обрабатывает, флаги компиляции выставляет, экспортирует его, а дальше SConscript-ом инклудит SConstruct-ы проектов.
SConstruct-ы проектов импортируют environment, добавляют в него свои target-ы. В результате scons собирает всё, scons project1 собирает project1. При этом всё собирается с одинаковыми настройками.
Чтобы scons из поддиректории проекта собирал проект, наверное, можно допилить SConstruct-ы проектов, чтобы они определяли, что их вызывают напрямую, и правильно это обрабатывали.

oleg1331

спасибо. как раз думаю в этом направлении.
import/export меня как раз и смутил тем, что в этом случае SConscript подпроектов будет подразумевать, что их уже откуда-то вызывают.
надо поппробовать как-то определить, есть переменная в import или нет. и если нет - подгрузить дополнительный скрипт конфигурации из корня.

oleg1331

не могу разобраться, как использовать конструкцию типа env.Sconscript ?
я пытаюсь сконфигурировать environment, а затем вызвать с заданными настройками Sconscript:

env = DefaultEnvironment
env.Replace(CCLFAGS = '-DSOME')

env.VariantDir('dist1', 'src', 0)
env.SConscript('dist1/SConstruct')

oleg1331

попробовал сделать через экспорт/импорт. всё равно не работает
Рутовый 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'])

oleg1331

хм.
а если рутовый SConstruct изменить так:

env = Environment(CCFLAGS = '-DSOME')

VariantDir('dist2', 'src', 0)
SConscript('dist2/SConstruct', exports='env')

то всё работает...
Оставить комментарий
Имя или ник:
Комментарий: