Задать вопрос
  • Socket.gaierror: [Errno 11003] getaddrinfo failed, что делать?

    Vindicar
    @Vindicar
    RTFM!
    Что-то мне подсказывает, что вместо email нужно указывать адрес SMTP сервера.
    Ответ написан
    Комментировать
  • Добавление аргументов к функции с threading?

    Vindicar
    @Vindicar
    RTFM!
    1. На момент вызова конструктора Thread переменная conn ещё не существует. Тебе нужно создавать поток тогда, когда она уже получила значение.
    2. Не вызывай метод run(). Он будет вызван сам, в отдельном потоке. Для запуска этого потока нужно вызвать start(). И имей ввиду, что у тебя send() отрабатывает однажды, и останавливается.

    Я бы посоветовал попрактиковаться в работе с потоками, для начала.
    Ответ написан
    Комментировать
  • Программа proxy-vpn?

    Vindicar
    @Vindicar
    RTFM!
    1. Настрой свой VPN так, чтобы он не прописывал себя как шлюз по умолчанию (default gateway). В этом случае тебе будут доступны ресурсы внутри VPN-сети, но трафик будет идти через VPN только при обращении к этим ресурсам.
    2. Подними прокси сервер, настрой его так, чтобы он обслуживал только запросы изнутри VPN. Тогда запросы к этому прокси будут идти через VPN, а остальной трафик - напрямую.

    Ну или попробуй настроить ShadowSocks, оно поднимает локальный прокси, который заворачивает свой трафик в туннель до сервера.
    В принципе то же самое можно провернуть даже с помощью SSH, через dynamic port forwarding.
    Ответ написан
    Комментировать
  • Лаконичный код, для нуба на Python =/ _main_, _name_?

    Vindicar
    @Vindicar
    RTFM!
    Это несложно, на самом деле.
    Когда ты делаешь import module_name, Питон ищет либо файл module_name.py, либо пакет module_name. Про пакеты пока говорить не будем. Если такой файл нашелся, и он ещё не был импортирован, то он выполняется в контексте импортирующего скрипта. При этом получается объект-модуль, и ссылка на него помещается в переменную module_name в импортирующем скрипте.
    Пример:
    # a.py
    def somefunc():
        print('Hi!')
    
    print('a is executed')
    
    # b.py
    import a  # >>> a is executed
    a.somefunc()  # >>> Hi!

    Имя, под которым импортируется модуль, помещается в переменную __name__. Изменим код так:
    # a.py
    def somefunc():
        print('Hi!')
    
    print(__name__, 'is executed')
    
    # b.py
    import a  # >>> a is executed
    a.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__

    Таким образом, мы видим, что для исполняемого скрипта переменная __name__ содержит строку "__main__", а импортируемые скрипты увидят в ней только своё имя. Причем неважно, если ты переименуешь модуль:
    # a.py
    def somefunc():
        print('Hi!')
    
    print(__name__, 'is executed')
    
    # b.py
    # импортируем модуль и переименовываем его
    import a as d  # >>> a is executed
    d.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__

    Именно эта особенность и позволяет писать код, который выполнится только если питон-скрипт выполняется непосредственно.
    # a.py
    # Этот код выполнится в любом случае
    def somefunc():
        print('Hi!')
    
    if __name__ == '__main__':
        # этот код выполнится только если a выполняется непосредственно
        print(__name__, 'is executed') # Всегда выведет __main__ is executed
    else:
        # а этот код выполнится только если a импортируется в другой модуль
        print('Imported as', __name__)
    # b.py
    import a  # >>> Imported as a
    a.somefunc()  # >>> Hi!
    print('And I am', __name__)  # >>> And I am __main__
    Ответ написан
    1 комментарий
  • Что делать: ValueError: I/O operation on closed file?

    Vindicar
    @Vindicar
    RTFM!
    Не используй with для таких вещей, просто
    file = open('avatar/' + f'{idfot1}', 'rb')
    Иначе with закроет файл до того как бот успеет подхватить его содержимое.
    Лучше вызови file.close() вручную в конце.
    Ответ написан
    Комментировать
  • Почему удаляются не все объеты класса Int?

    Vindicar
    @Vindicar
    RTFM!
    ['a', 1, 2, 'c']
    После того как ты удалил 1, 2 встанет на его место. Но этот элемент уже был обработан, и цикл пойдёт дальше, к 'c'.
    Если тебе нужно удалять элементы из списка в процессе итерации, итерируйся начиная с конца. Тогда будет меняться только позиция уже обработанных элементов.
    И делай итерацию не напрямую по списку, а по индексу.
    Ответ написан
  • Как запустить фоновую задачу?

    Vindicar
    @Vindicar
    RTFM!
    Когда ты делаешь await, ты говоришь "останови работу данной корутины, дождись, пока не закончится операция после await, потом продолжи работу". Пока одна корутина остановлена, другие могут выполняться. В общем, почитай про то, как работает асинхронная программа.
    Если тебе нужно запустить корутину, не дожидаясь её завершения, asyncio.create_task() в помощь.

    Стоит понимать, что код, который ты запускаешь через asyncio.create_task(), должен тоже быть асинхронный! Если ты завернёшь обычный синхронный вызов в корутину, и запустишь её через create_task(), чуда не будет - бот всё равно встанет колом, пока вызов не закончится.
    Так что взгляни лучше на свой парсер - если он основан на синхронной библиотеке типа requests, перепиши его на aiohttp.
    Ответ написан
  • Как получить список онлайна на сервере?

    Vindicar
    @Vindicar
    RTFM!
    Документацию читал?
    Guild.members содержит полный список пользователей сервера, просто пройдись по нему и выбери тех, у кого Member.status будет такой, какой нужно тебе.
    Ответ написан
    3 комментария
  • Телеграм бот + веб сервер, что использовать?

    Vindicar
    @Vindicar
    RTFM!
    И боту и Flask нужен вечный цикл для работы. Так что либо разноси их по разным потокам, либо разноси их по разным процессам (т.е. по разным скриптам).
    Ответ написан
  • Как получить список всех пользователей на сервере Discord?

    Vindicar
    @Vindicar
    RTFM!
    Клиент - это твой бот. Если почитать немножко поглубже, найдешь описание класса Bot
    Represents a discord bot.

    This class is a subclass of discord.Client and as a result anything that you can do with a discord.Client you can do with this bot.

    Очень частая ошибка - пытаться работать одновременно с экземпляром Client и экземпляром Bot. Это просто не нужно.
    Ответ написан
  • Как скачать видео?

    Vindicar
    @Vindicar
    RTFM!
    Устанавливаешь youtube-dl, и запускаешь его как-то так:
    youtube-dl -v -r 1M -f best -c -i -w -o "%(title)s.%(ext)s" --download-archive archive.txt URL_канала_или_плейлиста

    -v - выводить подробную информацию о прогрессе
    -r 1M - ограничение скорости в 1 мегабайт/сек, чтобы не выжрало весь канал.
    -f best - выбирать лучшее качество видео
    -c - при ошибке скачивания не начинать видео сначала, а докачивать
    -i - не останавливаться, если видео скачать не удалось, идти дальше по плейлисту
    -w - не перезаписывать файлы, если они существуют
    -o "%(title)s.%(ext)s" - формат имени файла
    --download-archive archive.txt - вести список скачанных видео, чтобы при перезапуске продолжить с того места, где остановился.

    Есть еще опции --username и --password, но я ими не пользовался, ничего сказать не могу.
    Ответ написан
    Комментировать
  • Python. Как отсортировать двухмерный список?

    Vindicar
    @Vindicar
    RTFM!
    Если j == __COLS - 1, но i < __ROWS - 1, то ты попытаешься обратиться к элементу a[i][__COLS - 1 + 1], т.е. a[i][__COLS]. Я полагаю, в этом и дело.
    Не знаю насчёт Java, но в C++ вполне возможно, что у тебя строки матрицы лежат в памяти подряд, так что ты фактически нечаянно обращаешься к a[i+1][0], тем самым корректно "склеивая" строки.
    Ответ написан
  • Как передавать значение в ssh в ответ bat?

    Vindicar
    @Vindicar
    RTFM!
    Если ввод данных в программу производится со стандартного ввода, то должно быть возможно использовать перенаправление ввода/вывода вроде my_bat.bat < input.txt где в input.txt будут вводимые значения, по порядку, каждое на отдельной строке. Если же стандартный ввод не используется, это не сработает.
    Ответ написан
    1 комментарий
  • Можно ли создавать экземпляры класса внутри самого класса?

    Vindicar
    @Vindicar
    RTFM!
    Это вопрос сцепления классов.
    Если ты внесешь это в метод класса, то теперь класс должен знать о коллекции humans, и, что ещё хуже, об информации в объекте settings. Нужно ли ему это знание для выполнения своих основных обязанностей? Если нет, делать эту операцию методом класса не имеет особого смысла.
    И я бы сказал, это слишком тривиально, чтобы вытаскивать в метод.
    Ответ написан
  • Ошибка PermissionError: [Errno 13] Permission denied при попытке редактирования файла .xlsx во время его использования. Как решить?

    Vindicar
    @Vindicar
    RTFM!
    Святослав Смирнов, никак, Эксель требует эксклюзивного доступа к файлу.
    Если нельзя закрыть его на время обновления файла, твой единственный вариант - достучаться до экселя через COM-автоматизацию, натйи окно, где открыт этот файл и заставить его изменить значения в ячейках. Это гемморой, прямо скажем.
    Ответ написан
    Комментировать
  • Сортировка файлов по части имени + формат на Python?

    Vindicar
    @Vindicar
    RTFM!
    Можно сделать обобщённое решение. Описываешь функцию преобразования, которая имя файла превращает в относительный путь к файлу.
    from os import path
    
    def get_folder(fname: str) -> str:
        ... # тут будет код
    
    base_folder = r'C:\тут\корневой\каталог\куда\складывать\файлы'
    for file in files: #перебираешь список файлов, у тебя этот код уже есть
        subpath = get_folder(path.basename(file))
        if subpath is None: # если функция вернула None, игнорируем файл
            continue
        source_path = path.abspath(file)
        target_path = path.join(base_folder, subpath)
        # и переносишь/копируешь файл из source_path в target_path


    Хорошо, а как реализовать get_folder()?
    Описываешь имя файла регуляркой, например, такого вида:\w+?(?P<Num>\d+)\.(?P<Ext>\w+)
    Как видим, эта регулярка содержит две именованных захватываемых группы - цифры перед точкой Num, и расширение Ext.
    Если тебе хватит точного совпадения, и не требуется делать что-то вида "файлы с цифрами 000-100 в папку 100", то реализация будет примерно такая:
    import re
    NAME = re.compile(r'\w+?(?P<Num>\d+)\.(?P<Ext>\w+)', re.I)
    TYPES = { #сортировка по типам
        'aac': 'AUDIO',
        'mp4': 'VIDEO',
        'jpg': 'IMAGES',
        None: 'MISC', #всё остальное
    }
    
    def get_folder(fname: str) -> str:
        m = NAME.match(fname) #пусть имя файла anything100.jpg
        if m is None: #имя файла не по шаблону - непонятно что делать с файлом
            return None # или говорим "не трогай файл"
            #return f'{TYPES[None]}/{fname}' # или кидаем в папку для неразобранного
        data = m.groupdict() # data = { 'Num': '100', 'Ext': 'jpg' }
        data['File'] = fname # data = { 'Num': '100', 'Ext': 'jpg', 'File': 'anything100.jpg' }
        data['Type'] = TYPES.get(data['Ext'].lower(), TYPES[None]) # data = { 'Num': '100', 'Ext': 'jpg', 'File': 'anything100.jpg' , 'Type': 'IMAGES' }
        return '{Type}/{Type}{Num}/{File}'.format(**data) # IMAGES/IMAGES100/anything100.jpg

    Дальше подгонишь как тебе надо, меняя реализацию get_folder().
    Ответ написан
    Комментировать
  • Python телеграм бот база данных sql?

    Vindicar
    @Vindicar
    RTFM!
    Боюсь, совет тут будет "поучиться программированию и работе с базами данных в целом". Вот кроме шуток.
    1. Зачем проходиться по базе циклом, если можно написать простейшей SELECT с фильтрацией блоком WHERE?
    2. Зачем объявлять бота и обработчик событий внутри этого цикла? У вас выживет только последняя копия для последней строки.

    Короче, итоговый код должен иметь приблизительно такой вид:
    @bot.message_handler()  
    def start(message):
        cursor = connection.cursor()
        row = cursor.execute('SELECT фамилия FROM OPCFIO WHERE имя = %s LIMIT 1', (message.text,) ).fetchone()
        if row is None:
            # не нашли фамилию, реакцию на это пропиши сам
        else:
            last_name = row[0] # нашли, она лежит в last_name, делаем с ней что нужно

    И НИКАКОГО ЦИКЛА ПО ВСЕЙ БД.
    Ответ написан
    2 комментария
  • Как наиболее эффективно прочитать и работать с большим csv в Python?

    Vindicar
    @Vindicar
    RTFM!
    Не очень ясно, какие столбцы идентифицируют объект недвижимости в файле. GUID, похоже, относится к факту купли-продажи. Так что поясни, на что смотреть.

    Я бы прочитал файл построчно, выбирая Postcode и подсчитывая количество тех или иных значений. Будет объёмно, но уж точно не 20 гигов. Затем посмотрел бы на гистограмму - много ли уникальных Postcode (т.е. тех, которые встречают один раз). Если много, то тогда достаточно посмотреть только на те Postcode, которые встречаются неоднократно. Это позволит уменьшить размер файла. В дальнейшем его можно фильтровать дальше по той же схеме, но с другими полями.
    Ответ написан
  • Почему python не видит модуль?

    Vindicar
    @Vindicar
    RTFM!
    Проекты в PyCharm могут использовать системный интерпретатор, или виртуальное окружение (отдельную копию интерпретатора для проекта). Соответственно модули, установленные в одном, другой не увидит.
    Проверь, что используешь, и куда ставишь.
    Ну и да, имена устанавливаемых пакетов и импортируемых модулей в студию. Может, у тебя просто опечатка в импорте.
    Ответ написан
    3 комментария
  • Как собрать 32-битный exe файл?

    Vindicar
    @Vindicar
    RTFM!
    Поплярные упаковщики питона в exe просто засовывают туда весь интерпретатор питона (ну может выбирает только используемые модули) вместе с кодом скрипта. Это НЕ настоящая компиляция.
    Так что делай вывод сам, можно ли упаковать скрипт в 32-битный экзешник, не имея 32хбитного питона на машине.
    Если есть полноценный транслятор Питона в C++ или подобный честный комплируемый язык, он мне не известен.
    Ответ написан
    Комментировать