Addon Version into File (3.5)

import bpy
import os

def save_addon_versions():
addons_folder = bpy.utils.user_resource(‘SCRIPTS’, “addons”)

addon_versions = {}
for file_name in os.listdir(addons_folder):
    if file_name.endswith(".py"):
        file_path = os.path.join(addons_folder, file_name)
        addon_name = os.path.splitext(file_name)[0]

        with open(file_path, "r", encoding="utf-8") as file:
            addon_code = compile(file.read(), file_path, 'exec')
            addon_globals = {}
            addon_locals = {}
            exec(addon_code, addon_globals, addon_locals)
            addon_info = addon_locals.get("bl_info", {})
            addon_version = addon_info.get("version", (0, 0, 0))
            addon_versions[addon_name] = addon_version

with open("addon_versions.txt", "w") as file:
    for addon_name, addon_version in addon_versions.items():
        file.write(f"{addon_name}: {addon_version}\n")

save_addon_versions()

why this does not work?

Hello. Would be a lot easier if you told us what doesn’t work here (ie what it should be doing and what it does (or doesn’t ) instead). Cheers

import bpy
def save_addon_versions():
# Alle installierten Add-Ons auflisten
addons = bpy.context.preferences.addons

# Versionsnummern der installierten und aktivierten Add-Ons speichern
addon_versions = {}
for addon_name, addon_module in addons.items():
    if addon_module.is_enabled:
        addon_version = addon_module.bl_info.get("version", (0, 0, 0))
        addon_versions[addon_name] = addon_version

# Speichern der Versionsnummern in einer Datei
with open("addon_versions.txt", "w") as file:
    for addon_name, addon_version in addon_versions.items():
        file.write(f"{addon_name}: {addon_version}\n")

Funktion aufrufen, um die Add-On-Versionen zu speichern

save_addon_versions()

This ist the Error Message:
Python: Traceback (most recent call last):
File “\Text”, line 20, in
File “\Text”, line 10, in save_addon_versions
AttributeError: ‘Addon’ object has no attribute ‘is_enabled’

For the first you may insert path=( but i’m not sure why you want to exec the addons… )

import bpy
import os

def save_addon_versions():
    addons_folder = bpy.utils.user_resource('SCRIPTS', path="addons")

    addon_versions = {}
    for file_name in os.listdir(addons_folder):
        if file_name.endswith(".py"):
            file_path = os.path.join(addons_folder, file_name)
            addon_name = os.path.splitext(file_name)[0]

            with open(file_path, "r", encoding="utf-8") as file:
                addon_code = compile(file.read(), file_path, 'exec')
                addon_globals = {}
                addon_locals = {}
                exec(addon_code, addon_globals, addon_locals)
                addon_info = addon_locals.get("bl_info", {})
                addon_version = addon_info.get("version", (0, 0, 0))
                addon_versions[addon_name] = addon_version

    with open("addon_versions.txt", "w") as file:
        for addon_name, addon_version in addon_versions.items():
            file.write(f"{addon_name}: {addon_version}\n")
save_addon_versions()

for the second:

import bpy
def save_addon_versions():
# Alle installierten Add-Ons auflisten
    addons = bpy.context.preferences.addons

    # Versionsnummern der installierten und aktivierten Add-Ons speichern
    addon_versions = {}
    for addon_name, addon_module in addons.items():
        if addon_module.is_enabled:
            addon_version = addon_module.bl_info.get("version", (0, 0, 0))
            addon_versions[addon_name] = addon_version

    # Speichern der Versionsnummern in einer Datei
    with open("addon_versions.txt", "w") as file:
        for addon_name, addon_version in addon_versions.items():
            file.write(f"{addon_name}: {addon_version}\n")
    #Funktion aufrufen, um die Add-On-Versionen zu speichern
save_addon_versions()

it seem to be that the addon.items() are a list of for example
('mesh_tools', <bpy_struct, Addon("mesh_tools") at 0x7fa77e4zzzz>)

so the first is the name (as you used) the second is the struct
class bpy.types.Addon(bpy_struct)
…so it must be further “selected”… (?)