Ошибка получения атрибута: модуль 'mod_commands' не имеет атрибута 'ban' - хотя я его добавил - PullRequest
1 голос
/ 15 января 2020

Я сейчас работаю над ботом Discord с discord.py.

У меня есть основной скрипт, где все командные события запускают функции из других скриптов. Все работало нормально, но затем я решил реализовать базы данных и скачал PostgreSQL и asyncpg. С тех пор я получаю эту ошибку: AttributeError: module 'mod_commands' has no Attribute 'ban' при попытке вызвать функции из моего скрипта с именем mod_commands.py.

Вызов функций из других скриптов работает нормально. Я ничего не менял, поэтому уверен, что эта ошибка связана с PostgreSQL или asyncpg. Дело в том, что у меня нет понятия , почему это происходит, и как Я мог бы попытаться это исправить.

Я делаю это на Raspberry Pi 4 Модель B с Linux 10 (Buster). Моя Python версия 3.7.3.

Вот сценарии, о которых я говорю:

programm.py:

import mod_commands
from discord.ext import commands
import discord

bot = commands.Bot(command_prefix='~',description=description)

@bot.command(name='ban')
@commands.has_permissions(ban_members=True)
@commands.bot_has_permissions(ban_members=True)
async def ban(ctx, members : commands.Greedy[discord.Member], *, reason = 'Idiotisches Verhalten'):
    await mod_commands.ban(ctx, members, reason)

def getLatency():
    return bot.latency

bot.run(TOKEN)

mod_commands.py:

import bot_utility
from discord.ext import commands

async def ban(ctx, members, reason):
    print('command => mod_commands.ban')
    bannableMembers = []
    for member in members:
        if(member.guild_permissions.administrator):
            await ctx.send('{} kann nicht gebannt werden.'.format(member.display_name))
        else:
            bannableMembers.append(member)
            embed = bot_utility.createEmbed(ctx.guild, 'Du wurdest gebannt', 'Grund: ' + reason, 0xFF0000)
            await member.send(embed=embed)
            await ctx.guild.ban(member, reason=reason)
    if(bannableMembers != None):
        embed = bot_utility.createEmbed(ctx.guild, 'Banns: (' + str(len(bannableMembers)) + ')', 'Grund: ' + reason, 0xff0000)
        for member in bannableMembers:
            embed.add_field(name=member.display_name, value=member.id)
        await ctx.send(embed=embed)

и последнее по порядку, но не по значению: bot_utility.py:

import discord
import programm

def createEmbed(guild, title, description, colour : discord.colour):
    embed = discord.Embed(title = title, description=description, colour=colour)
    embed.set_footer(text=guild.name + '||%.2fs' % programm.getLatency(), icon_url=guild.icon_url)
    embed.type = 'rich'
    return embed

Я пытался найти ответы самостоятельно, но похожие вопросы были либо связаны с особым случаем, для которого я не Я не верю, что решения могут работать на меня или остались без ответа. Вот ссылки, на случай, если они понадобятся вам по какой-либо причине:

Ошибка атрибута У объекта 'module' нет атрибута 'DateField'

Ошибка получения атрибута : модуль 'matplotlib.pyplot' не имеет атрибута 'canvas'

AttributeError: объект 'module' не имеет атрибута 'tests'

Если вам нужно больше информации, пожалуйста, скажите мне. Спасибо, что нашли время подумать об этом.

1 Ответ

2 голосов
/ 15 января 2020

Причина этого в том, что у вас есть циклический импорт:
programm импортирует mod_commands, который импортирует bot_utility, который импортирует programm, et c.

Вы следует передать задержку бота createEmbed вместо импорта и использовать для него метод.

...