Как создать список импортируемых в данный момент модулей?

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть два разных файла .py, оба в одном каталоге — Setup.py amp; Main.py . У Setup.py меня есть следующее определение функции.

 def imported_modules(send_to_reqs = False,append_mod = True) :
    '''
    inputs: 
    - send_to_reqs, boolean, optional, default true:
        - If true, function will return a dictionary keys = modules, values = version that has been imported
        - If false, function will write to requirements text, 
    - append_mod, boolean, optional, default False:
        - If True, function will append to requirements
        - If False, fucntion will overwrite requirements    
    '''
    import sys 
    # gets list of modules imported
    modules = list(set(sys.modules) amp; set(globals()))
    modules_dict = {}
    #iterates through the list of modules and appends a dictionary with the verison 
    for module_name in modules:
        module = sys.modules[module_name]
        modules_dict[module_name] =  getattr(module, '__version__','unknown')
    #writes to the reqs document 
    if send_to_reqs == True:
        if append_mod == True:
            # opens the requirements text as append only and appends the modules to it 
            f = open("Requirements.txt","a ")
            for key, value in modules_dict.items() :
                f.writelines(str(key   ":"   value   "n" ))
            f.close()
            return "Requirements.txt has been updated with latest modules."
        else:
            # opens requirements an removes existing modules and attaches new ones.
            # opens as read only and saves the previous data. 
            f = open('Requirements.txt', 'r')
            data = f.read()
            f.close()
            import re, datetime
            # substitutes the last updated entry with currents date and time 
            data = re.sub("(Last updated:) (d*-d*-d* d*:d*:d*.d*)","Last updated: "   str(datetime.datetime.now()), data)
            #searchs for the position of --END and gets location
            a = re.search(r'(.*?)(?=--END)',data)
            # uses location to get 
            updated_header = data[:int(a.end() 6)]
            for key ,value in modules_dict.items() :
                updated_header = updated_header    key   ":"   value   "n" 
            f = open('Requirements.txt', 'w')
            f.write(updated_header)
            f.close()
            return "Requirements file has been replaced."
    else :
        return modules_dict
 

Моя функция выполняет некоторую логику, но по сути получает словарь импортированных модулей и записывает его в файл.

В моем Main.py я в основном просто импортирую кучу модулей для тестирования функции. Затем я пытаюсь импортировать функцию и посмотреть, какие результаты получаются. Каждый раз, когда я выполняю, я получаю пустой список, в котором я ожидаю получить список (numpy, win32com, bs4, scipy, Setup), поскольку первое, что я делаю, это импортирую эти модули.

 import numpy, win32com , bs4, scipy, Setup
send_to_reqs = True
append_mod = True
a = Setup.imported_modules(send_to_reqs, append_mod)
print(a)
 

Когда я создавал код, у меня было определение функции внутри Main.py , и как только я его заработал, я перешел на Setup.py , но теперь он всегда выводит пустой словарь. Кто-нибудь может помочь мне устранить неполадки в моем коде? почему это работает, когда его определяют в том же файле .py, но когда я записываю его в другой файл .py, но в том же каталоге, и импортирую функцию, тогда она не работает? вот часть функции, которая выполняет работу по созданию словаря

 import sys 
# gets list of modules imported
modules = list(set(sys.modules) amp; set(globals()))
modules_dict = {}
#iterates through the list of modules and appends a dictionary with the version 
for module_name in modules:
     module = sys.modules[module_name]
     modules_dict[module_name] =  getattr(module, '__version__','unknown')