Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 28, 2017 03:06:28

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

from file_name import *

Есть с десяток файлов в директории, в которых указанны различные параметры.
Можно ли как то их подгрузить по списку ? Т.е. не указывая import на точный файл, а просто прочитать директорию и если файл соответствует local_*.py , то выполнить его import.

Офлайн

#2 Окт. 28, 2017 12:05:36

python335
Зарегистрирован: 2016-10-19
Сообщения: 88
Репутация: +  -8  -
Профиль   Отправить e-mail  

from file_name import *

Да можно. Юзай importlib
Про него почитай на pythonworld или где-то еще

Офлайн

#3 Окт. 28, 2017 12:07:38

python335
Зарегистрирован: 2016-10-19
Сообщения: 88
Репутация: +  -8  -
Профиль   Отправить e-mail  

from file_name import *

 import importlib,os
def import_mod(name):
    return importlib.import_module(name)
def main_proc():
    r_mdls = os.listdir(os.curdir)
    mdls = []
    for c in r_mdls:
        if c == 'main.py': pass # Чтобы он сам себя не импортировал))
        elif c.endswith(".py"): mdls.append(c[:-3])
        else: pass
    for d in mdls:
        mod = importlib.import_module(d)
        options = mod.lolz(Тут берешь нужные тебе параметры) # mod.lolz просто часть из моей проги, тут можешь что угодно делать - mod.options или чтото вроде того
        

Отредактировано python335 (Окт. 28, 2017 12:09:07)

Офлайн

#4 Окт. 28, 2017 12:09:25

python335
Зарегистрирован: 2016-10-19
Сообщения: 88
Репутация: +  -8  -
Профиль   Отправить e-mail  

from file_name import *

плз +репу

Офлайн

#5 Окт. 28, 2017 21:03:52

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

from file_name import *

Не совсем так, или не понимаю до конца.

Поясню более задачу:
имеем директорию settings с файлами local_*.py , в которых находится конфигурация.

Сейчас подгрузка делается следующим образом:

 from local_db import *
from local_keys import *
from local_data import *
print(KEY_ID)

Содержимое файлов простое, к примеру local_keys.py:
 KEY_ID = 'xxx'
KEY_PASS = 'yyy'

Как такое реализовать ? Т.е. банальный аналог php: include($file_name); А с importlib по документации идет подключение определенного модуля, а не полного содержимого.

 import importlib
import re
rs = os.listdir(os.path.join(BASE_DIR, 'project/settings'))
for file_name in rs:
    match = re.search(r"local_(.*).py$", file_name, re.MULTILINE)
    if match:
        # php -> include($file_name) , а как с python ?

Отредактировано VadimK (Окт. 28, 2017 21:05:26)

Офлайн

#6 Окт. 29, 2017 00:20:00

sander
Зарегистрирован: 2015-02-19
Сообщения: 317
Репутация: +  53  -
Профиль   Отправить e-mail  

from file_name import *

VadimK
можно сделать

 globals().update(importlib.import_module(<name>).__dict__)
но лучше не стоит

что мешает собрать конфиги в 1 большой конфиг, который потом и импортировать?

Офлайн

#7 Окт. 29, 2017 09:23:33

VadimK
Зарегистрирован: 2013-07-03
Сообщения: 199
Репутация: +  16  -
Профиль   Отправить e-mail  

from file_name import *

Для удобства хочется разбить конфиг на много мелких и подгружать оттуда данные без редактирования основного конфига.

Офлайн

#8 Окт. 29, 2017 10:38:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

from file_name import *

Для того что вы делаете скорее подходит не import а execfile.

 for filename in glob("config/local_*.py"):
      exec(open(filename).read())

Если у вас файлы простые так может и не париться и использовать одно из решений: configparser/json/yaml
Это удобнее если в конфиге много строковых литералов.



Отредактировано doza_and (Окт. 29, 2017 10:38:43)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version