Как перейти в 2 разные директории с помощью sys.path.append

NeDoPrOgEr228

Новичок
Пользователь
Дек 28, 2021
1
0
1
Я сейчас писал штуку чтобы находить установленные модули в game\mods. То есть в mods есть папка, в которой есть файл mod_init.py с общей информацией о модуле. И я в цикле перебираю директории с этим файлом, и с каждой директории я импортирую name version и тд, попутно записывая его в список l. Код:

Python:
path = os.path.abspath('')

def find_files(catalog, f):

    lfindf = []
    for root, dirs, files in os.walk(catalog):
        lfindf += [os.path.join(root, name) for name in files if name == f]
    return lfindf


modules = find_files(path+'\mods\\', 'mod_init.py')
count = 0
l = []
l1 = []


for module in modules:
    m = str(module.rstrip('mod_init.py'))
    sys.path.append(m)
    from mod_init import name, version, textures, modific
    m1 = (name, version, textures, modific)
    m2 = (name, version)
    l.append(m1)
    l1.append(m2)
    sys.path.append(path)
    count += 1

Вся суть проблемы в том, что у меня там два модуля lol, test. Только все пошло немного не по плану и импортировался только самый верхний модуль 2 раза в список. То есть то что должно быть в списке это test 1.0 и lol 1.1, а там lol 1.1 и lol 1.1. Насколько я понял пути к модулям я нахожу правильно (они содержатся в m), но sys.path.append сработал только на первый путь. Вместо того чтобы зайти в обе директории, почему-то я захожу только в первую.
 

stud_55

Модератор
Команда форума
Модератор
Апр 3, 2020
1 522
672
113
Вся суть проблемы в том, что у меня там два модуля lol, test. Только все пошло немного не по плану и импортировался только самый верхний модуль 2 раза в список. То есть то что должно быть в списке это test 1.0 и lol 1.1, а там lol 1.1 и lol 1.1. Насколько я понял пути к модулям я нахожу правильно (они содержатся в m), но sys.path.append сработал только на первый путь. Вместо того чтобы зайти в обе директории, почему-то я захожу только в первую.
Так происходит потому, что имя модуля не удаляется из словаря импортированных модулей (sys.modules) и интерпретатор не импортирует модуль заново. А также путь к модулю после добавления в sys.path не удаляется из этого списка и интерпретатор ищет модуль по данному пути (так как путь к нему добавлен раньше пути к следующему модулю, а названия у них одинаковые).
Чтобы модули импортировались можно удалять имя модуля из sys.modules и путь к нему из sys.path:
Python:
import os
import sys


path = os.path.abspath('')

def find_files(catalog, f):

    lfindf = []
    for root, dirs, files in os.walk(catalog):
        lfindf += [os.path.join(root, name) for name in files if name == f]
    return lfindf


modules = find_files(path + '\mods\\', 'mod_init.py')
count = 0
l = []
l1 = []


for module in modules:
    m = str(module.rstrip('mod_init.py'))
    print(m)
    sys.path.append(m)  # добавляем путь к модулю в sys.path

    from mod_init import name, version, textures, modific
    m1 = (name, version, textures, modific)
    m2 = (name, version)
    l.append(m1)
    l1.append(m2)
    sys.path.remove(m)  # удаляем путь из списка sys.path
    del sys.modules['mod_init']  # удаляем имя модуля из словаря с импортированными модулями
    count += 1


print(count)
print(l1)
print(l)
 

Форум IT Специалистов