Задать вопрос
Ответы пользователя по тегу Python
  • Как запустить программу в одной консоле, но чтобы выполнение происходило в другой?

    Vindicar
    @Vindicar
    RTFM!
    Можно обойтись без промежуточного cmd.exe если использовать модуль subprocess, и передать при создании дочернего процесса флаг subprocess.CREATE_NEW_CONSOLE (доступен только на винде).
    Но тебе всё равно придётся вынести часть кода в дочерний процесс, так как один процесс может иметь только одно окно консоли.

    Лучше подумай, не стоит ли использовать GUI. Если очень хочется консольку, то можно создать подобие GUI в ней, используя стандартный модуль curses. Проблема в том, что curses - либа под unix, так что надо искать порт под винду.
    Например, этот пакет добавляет поддержку винды в стандартный модуль curses, делая программу более переносимой.
    Ответ написан
    Комментировать
  • Как создать зависящие от времени функции не останаливая работу программы на pygame?

    Vindicar
    @Vindicar
    RTFM!
    У тебя должна быть фиксированная частота обновления логики игры.
    Тогда ты сможешь любые задержки выражать в числе кадров, которое должно пройти, прежде чем можно выполнить следующее действие. Соответственно у каждого действия есть счётчик кадров, если он не 0 - действие на кулдауне и выполнять его нельзя. Каждый кадр уменьшаешь ненулевые счётчики на 1.

    Чуть более тонкий подход - хранить время, оставшееся до истечения кулдауна. На каждом кадре измерять, сколько времени прошло с прошлого кадра, и вычитать этот интервал. Точность всё равно будет порядка одного кадра, но хотя бы при тормозах кулдауны не будут замедляться.

    Заодно почитай, что такое автомат состояний. Пригодится.
    Ответ написан
    Комментировать
  • Как предотвратить двойные нажатия?

    Vindicar
    @Vindicar
    RTFM!
    Вопрос на засыпку: если объект-кнопка обработал событие, остальные объекты его тоже получат?
    Если да, то именно такое поведение и будет наблюдаться. Надо как-то пометить, что событие уже было обработано элементом интерфейса. Либо изъять событие из очереди, либо как-то дать знать новому экрану, что события обрабатывать не надо.

    Альтернативно, вызывай коллбэк только если элемент зафиксировал и нажатие и отпускание кнопки без выхода курсора за пределы элемента. Тогда "остаточного" события будет недостаточно для активации кнопки.
    Ответ написан
    Комментировать
  • Python, что правильнее использовать, запуск бота на прямую или крон?

    Vindicar
    @Vindicar
    RTFM!
    Ну если на то пошло, то systemd умеет делать задачи-таймеры по типу крона. Хотя крон, пожалуй, на большем числе систем из коробки есть.

    Я бы сказал так. Если у тебя интервалы запуска более-менее статичные - используй systemd или cron.
    А вот если у тебя время следующего запуска нужно вычислять согласно некоторой нетривиальной логике - тут уже лучше самому сделать планировщик.
    Ответ написан
  • Как изменять сайт на питоне, аналогично javascript коду сайта?

    Vindicar
    @Vindicar
    RTFM!
    1) Как мне использовать питон код в javascript коде сайта

    Никак, большинство бразуеров поддерживает только JavaScript. Клиентский код придётся писать на нём.
    Зато ты можешь использовать любой язык на стороне сервера - если твоя программа поддерживает нужные протоколы (HTTP + websockets), браузеру будет всё равно, на чём она написана.
    2) Как я могу вносить изменения на работающую html страницу, аналогично работе javascript кода, написанного выше

    Использовать для этой цели JavaScript. JS подключается к вебсокету, Питон отдаёт данные через этот вебсокет, JS их принимает, интерпретирует как сообщения и преобразует страницу нужным образом.
    Ответ написан
    1 комментарий
  • Как сделать, чтоб код после исполнения автоматически перезапускался заново бесконечно?

    Vindicar
    @Vindicar
    RTFM!
    while True: вокруг участка, который нужно перезапускать заново.
    Можешь для надёжности завернуть участок в try: except Exception:.
    А вообще я подозреваю, что такую спамилку запросами забанят через час.
    Ответ написан
  • Как реализовать выход из программы или закрытие cmd консоли при вводе 'stop'?

    Vindicar
    @Vindicar
    RTFM!
    Грубое решение: настрой таймаут чтения, и при таймауте проверяй логическую переменную, которая хранит признак "пора остановиться". Тогда если ты эту переменную взведёшь, твои потоки-клиенты отвалятся, пусть и не сразу.
    Ответ написан
    Комментировать
  • Можно ли в python задать размеры окна другому приложению?

    Vindicar
    @Vindicar
    RTFM!
    Тебе нужна функция WinAPI SetWindowPos().
    Чтобы достучаться до винапи, используй стандартный модуль ctypes.
    Ответ написан
    Комментировать
  • Как можно распарсить текст на python?

    Vindicar
    @Vindicar
    RTFM!
    Модуль re в помощь. Если grep умеешь пользоваться, то и тут справишься.
    Ответ написан
  • Как сделать так чтобы бот понимал какой сегодня день недели?

    Vindicar
    @Vindicar
    RTFM!
    Учим стандартную библиотекц питона.
    Там это есть.
    import datetime
    day_of_week = datetime.datetime.now.weekday()
    Ответ написан
    3 комментария
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Почему в результате изменения второго списка меняется также и первый, если перед этим я приравнял второй список к первому?

    Vindicar
    @Vindicar
    RTFM!
    Читаем про изменяемые и неизменяемые объекты в питоне.
    Если коротко, когда ты делаешь a = b, ты не копируешь объект. Ты просто создаёшь новую ссылку на него.
    Достаточно проверить так:
    print(languages is new_list) # True
    Если объект изменяемый, то изменения будут видны по любой ссылке, что логично:
    a = [1, 2, 3]
    b = a  # b ссылается на тот же список
    b.append(4)  # список изменили

    Если объект неизменяемый, то это не так заметно, потому что ссылка заменяется на ссылку на новый объект:
    a = 5
    b = a  # b ссылается на 5
    a += 1  # a = a + 1 т.е. a = 6 - a теперь ссылается на новый объект 6, b - по прежнему на 5.


    Если нужна независимая копия списка, словаря или иного изменяемого объекта - делай её явно.
    Ответ написан
    1 комментарий
  • Как замокать путь для os.curdir в тесте?

    Vindicar
    @Vindicar
    RTFM!
    Просто сменить текущий рабочий каталог самому?
    Ответ написан
    Комментировать
  • Как использовать функцию написанную на Python в C#?

    Vindicar
    @Vindicar
    RTFM!
    1. Если нужно именно вызывать функции, то что-то типа Python.NET. А вообще на кой тебе, код же суперпримитивный, его в разы проще переписать на C# чем разбираться с внедрением питона в .NET среду.
    2. FileSystemWatcher
    Ответ написан
    6 комментариев
  • Как правильно вывести структуру из dll на c++ в Python?

    Vindicar
    @Vindicar
    RTFM!
    Разумеется, тебе и реализацию функции надо будет поправить, её заголовок должен совпадать с тем, который ты описал в заголовочном файле. Это же азы!
    Более того, у тебя и тело функции изменится. Теперь вместо
    __declspec(dllexport) outdata SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6) {
    outdata data;
    data.out_x1 = xy1;
    data.out_x2 = xy2;
    data.out_x3 = xy3;
    return data;
    }

    будет код вроде
    __declspec(dllexport) void SpiralsCoord(float x1, float x2, float x3, float x4, float x5, int x6, outdata* data) {
    //используем оператор ->, так как data теперь указатель на структуру, а не сама структура
    data->out_x1 = xy1; 
    data->out_x2 = xy2;
    data->out_x3 = xy3;
    }

    Ну а в Питоне тогда для передачи последнего параметера нужно будет сделать кое-что.
    1. Описать структуру outdata как класс-потомок ctypes.Structure.
    2. Создать экземпляр этой структуры.
    3. Описать прототип функции SpiralsCoord (или под каким именем она экспортируется?), указав типы параметров и возвращаемого значения.
    4. Использовать ctypes.byref() при передаче экземпляра структуры последним параметром.
    Ответ написан
    Комментировать
  • В чем ошибка кода?

    Vindicar
    @Vindicar
    RTFM!
    Ошибка в том, что ты пытаешься делать две вещи сразу.
    У тебя описан словарь фильтров:
    self.filters = {  # тут у тебя человекочитаемые заголовки
                "ID": tk.StringVar(),
                "Город": tk.StringVar(),
                "Температура": tk.StringVar(),
                "Погода": tk.StringVar(),
                "Скорость ветра": tk.StringVar(),
    }

    Но дальше ты делаешь
    # тут ты переносишь пару заголовок-значение в словарь строка:строка
    filter_values = {criteria: var.get() for criteria, var in self.filters.items()}
    ...
    for criteria, value in filter_values.items():
        if value:  # а тут ты внезапно решаешь что у тебя ключ - имя поля, а не заголовок
            conditions.append(f"{criteria} LIKE ?")


    Собственно, почему только с ID и работает поиск. Потому что это единственное поле, где заголовок совпадает с именем поля в таблице БД.
    Ответ написан
    Комментировать
  • При добавлении пользователя в таблицу в поле ID ставиться none, хотя я сделал проверку, пользователю присваивается ID. Что не так?

    Vindicar
    @Vindicar
    RTFM!
    Ты эту БД давно используешь? Просто новички часто споыткаются о простой факт. Запросы вида CREATE TABLE IF NOT EXISTS создадут отсутствующую таблицу, но не изменят таблицу, если она уже существует. Даже если структура таблицы отличается от заданной. Скажем, если ты добавил автоинкремент в запрос CREATE позднее, то в реальной таблице его не будет.
    В таком случае проще всего снести файл базы, чтобы она пересоздалась, и снова наполнить его данными.

    Также можешь попробовать узнать реальную структуру твоей таблицы так:
    SELECT sql FROM sqlite_schema WHERE type = 'table' AND name = 'customers'
    Ответ написан
    Комментировать
  • Как можно сделать метод класса сразу статическим и динамическим?

    Vindicar
    @Vindicar
    RTFM!
    По-хорошему должен быть только один способ работать с твоим классом. Выбери что-то одно и придерживайся этого подхода.

    Если очень хочется выстрелить себе в ногу, сделай метод статическим - это обеспечит его вызов и на классе, и на экземпляре - а внутри методла получай доступ к синглтон-экземпляру и работай с ним.

    Ну и да, я надеюсь что логгер ты пишешь только как упражнение, а не потому что не знаешь о модуле logging. =)
    Ответ написан
    Комментировать
  • Что за странная ошибка python? почему?

    Vindicar
    @Vindicar
    RTFM!
    Слишком много метаклассов используешь. Лучше максимум один во всей иерархии наследования твоего класса.
    Подозреваю, что у QMainWindow свой метакласс, у View свой, а потому не стоит наследоваться от них обоих.
    Да собственно, и вопрос - на кой тебе наследоваться от них обоих?
    Ответ написан
    Комментировать
  • Как выполнить функцию в другом файле и получить return без импорта?

    Vindicar
    @Vindicar
    RTFM!
    fastapi или flask хороший вариант если хочешь API на базе HTTP.
    Ответ написан
    Комментировать