Ответы пользователя по тегу Python
  • Как исправить проблему с кодировкой (UnicodeEncodeError: 'latin-1' codec can't encode characters..) в тг боте?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    qr = pyqrcode.create(x.encode('utf-8'))
    И приводите в следующий раз, пожалуйста, полный текст ошибки. Там еже всё указано где проблема. Какого черта вы заставляете гадать на кофейной гуще?
    Думаете интерпретатор вам этот весь "мусор" просто так написал?
    Так и задали бы вопрос: написал программу - не работает, памагити!
    Ответ написан
    Комментировать
  • Как получить все комбинации элементов строки в срезе?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас произведение строки трижды на себя. Строка длиной 3. Итого 3**3 == 27 вариантов.
    Каждому элементу можно поставить в соответствие порядковый номер.
    for i in range(27): 
        print(f'{i:2}:', i // 9 % 3, i // 3 % 3, i % 3)

    Числа после двоеточий - это индексы в исходной строке.
    Вы можете теперь получить (вычислить) любой i-ый элемент вашей последовательности:
    s = 'abc'
    def g(i):
        return s[i // 9 % 3], s[i // 3 % 3], s[i % 3]
    
    for i in range(len(s) ** 3):
        print(g(i))

    Можно обобщить:
    def g(s, i):
        n = len(s)
        return [
            s[i // n**(n-j-1) % n]
            for j in range(n)
        ]
    
    my_custom_string = 'abc'
    for i in range(len(my_custom_string) ** len(my_custom_string)):
        print(g(my_custom_string, i))


    Ну и раз уж пошла такая пьянка, можно сделать ваше умножение индексируемым:
    import itertools
    import functools
    import operator
    
    
    class Producti: 
         def __init__(self, *iters, repeat=1): 
             iters = [list(it) for it in iters]
             self.iters = iters * repeat
             self._len = functools.reduce(operator.mul, map(len, self.iters)) 
    
         def __len__(self): 
             return self._len 
    
         #def __iter__(self): 
         #    return (self[i] for i in range(len(self))) 
    
         def __getitem__(self, idx): 
             if isinstance(idx, slice): 
                 return (self[i] for i in range(len(self))[idx])
             if idx >= len(self):
                 raise IndexError(f'product index out of range')
             r = [] 
             d = 1 
             for it in self.iters: 
                 r.append(it[idx // d % len(it)]) 
                 d *= len(it) 
             return tuple(r[::-1]) 
    
    
    for x in Producti('abc', repeat=3)[3:7]: 
         print(x)

    Единственное, чем нам приходится жертвовать по сравнению со штатным product'ом - это распаковкой элементных итераторов. Нам это нужно, чтобы заранее знать как приводить число к индексам.
    P.S.
    Кстати, метод "__iter__", в принципе, не нужен, iter(Producti('aa', '12')) проитерируется теперь и так (когда есть исключение по выходу за пределы len).
    Ответ написан
    Комментировать
  • Python: можно ли в модуль импортировать обычный текстовый файл json?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Импортировать нельзя.
    Загрузить и присвоить содержимое json-файла переменной внутри модуля можно.
    Вы объясните что вам надо, а вам расскажут как это делать правильно. Судя по вашему вопросу вам не поможет никакой ответ на него.
    Ответ написан
    Комментировать
  • Как однозначно переопределить сложение?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    1. Нужно, чтобы классы A, B, C, D были потомками одного абстрактного класса Base. Абстрактный класс должен декларировать общий для них интерфейс.
    2. Нужно сделать ещё один класс G - потомок от Base. G должен содержать внутри список элементов класса Base. Кроме этого G должен реализовывать все абстрактные методы своего интерфейса путём вызова соответствующих методов вложенных в свой список объектов.
    3. Класс Base должен перекрывать метод сложения __add__. Результатом сложения возвращается экземпляр G, содержащий список из складываемых элементов.
    Ответ написан
    Комментировать
  • Парсер на Python?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    with zipfile.ZipFile('spam.zip', 'w') as z: 
        z.write('C:\Windows\explorer.exe', 'path/in/archive/and_new_name.exe')
    Ответ написан
    1 комментарий
  • Как осуществить автоматическое обновление программы при ее запуске?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что конкретно вам не понятно?

    При запуске прога делает HTTPS GET-запрос по предварительно зашитому в ней урлу. Если из заголовков следует, что эта версия проге не нужна, то можно оборвать соединение и не получать сам файл обновления. Того же можно добиться и двумя запросами: первый HEAD, а второй, при необходимости, GET.
    Если скачана новая версия, нужно проверить её контрольную сумму и, очень желательно, подпись. Но если у вас https, то с подписью возиться не обязательно.
    Далее нужно запустить в отдельном процессе шелл-скрипт, который дождётся завершения старой проги и после этого запустит новую.
    На этом старая прога завершает свою работу.
    Как только скрипт увидит, что старая закрылась, сразу подменяет файл и запускает новую.
    Если что-то пошло не так, то можно записать сообщение о проблеме в файл и повторно запущенная старая прога, увидев это сообщение не будет пытаться обновиться снова на ту версию, поскольку "что-то пошло не так", а будет ждать новую.

    Вариантов тут много. Наверно есть готовые библиотеки, которые это заточены делать. Из следовало бы создать, если бы их не существовало, а это значит, что они скорее всего уже есть и в изобилии. Ищите готовые решения.
    Ответ написан
    Комментировать
  • Как можно с одного скрипта Python(находится на виртуальной машине)запустить дугогой скрипт на Python(на другой виртуальной машине)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если я вас правильно понял, то нужно по инициативе программы на питоне в одной машине инициировать запуск программы на питоне в другой машине.
    Много способов:
    • SSH позволяет удалённо что-то запустить, а питон может шелл-команду с запуском ssh с параметрами выполнить локально. Это приведёт к желаемому вам результату. Но нужно прописать ключи и подготовить всё это. Не безопасный вариант.
    • Вторая программа (а удаленной стороне) может поднять веб-сервер и ждать сигнал на запуск какого-то куска кода() в виде http-запроса. Этот вариант лучше первого.
    • Можно поднять на одной из перечисленных или на отдельной машине сервис с очередью сообщений, например RabbitMQ. Сигнал для запуска может быть передан через него.

    Опишите для чего вам это и вам подскажут что обычно используют для этих целей. Возможно вы вообще не с той стороны подошли и нужно делать по-другому.
    Ответ написан
    2 комментария
  • Как вставить текст на картинку, чтобы он лежал на плоскости, заданной координатами?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вам нужны афинные преобразования.
    Вот их можно нагуглить на стек-офверфлоу
    Ответ написан
  • Как остановить цикл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас такой длинный цикл. что надо кнопкой останавливать -- переделывайте. Такого в приложении быть не должно.
    Длительные операции нужно делать кусочками и асинхронно.
    Сформируйте очередь задач. Каждая задача должна быть мелкой и атомарной.
    У вас тут, судя по всему, сплошная архитектурная лапша в коде.
    Не ясно как вы этот код запускаете, не ясно что у вас вокруг него.
    Ясно только, что вы тут намудрили какой-то витиеватый костыль и пытаетесь решить стандартную задачу каким-то кустарным дендрофекальным методом.

    Из всего могу срезюмировать.
    • Выделите и изолируйте модель задачи.
    • Накапливайте их в очереди.
    • Заполняйте очередь когда это требуется. Вытаскивайте и обрабатывайте отдельные задачи когда это возможно, но асинхронно.

    Более подробно можно подумать, если объясните чего пытаетесь тут добиться.
    Если попробовать играть по вашим правилам и дать ответ на именно ваш не очень правильный вопрос, то нужно обрабатывать интерфейс в отдельном треде, между тредами поднять мьютекс и по его состояние проверять в этом цикле. Но это плохой путь.
    Ответ написан
    1 комментарий
  • Почему else - invalid syntax?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите, к какому, по-вашему, оператору if относится этот else. С учетом расставленных вами отступов ни к какому.
    Ответ написан
    1 комментарий
  • Парсинг данных Python и тэг br?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    name, _, age = list(soup.find_all(class_='block')[0].children)
    Ответ написан
    Комментировать
  • Как пере-импортировать переменную из файла Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    import importlib
    import config
    from config import templates, admins
    
    
    def reload():
        global templates, admins
        imprtlib.reload(config)
        from config import templates, admins

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    py "('x'*random.randint(1, 10) for _ in range(100))" | \ 
    py -x "open(f'tmp/path_to_dest_folder/words_len={len(x):05}.txt', 'a').write(x+'\n')"

    Первая строчка генерит слова, в вашем случае там будет cat big_file.txt.
    Вторая строчка разгребает все по файлам.
    Ответ написан
    Комментировать
  • Поможете с "cb = lambda m: random.choice(m.group(1).split('|'))"?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Передаётся вот здесь:
    rgx.sub(cb, s)
    Все сопоставления регекспу будут подаваться этой функции в аргумент.
    cb = lambda m: \     # Это лямбда-функция с одним аргументом по имени m
        random.choice(   # результат функции вычисляется методом случайного выбора из
            m.group(1)   # текста (сопоставленного с первой скобкой регекспа)
            .split('|')  #  разбитого по символу "|"
        )

    Регексп rgx = re.compile('\{([^{}]*)\}') находит куски текста в фигурных скобках и m.group(1) будет соответствовать этому куску при каждом вызове лямбды.
    Ответ написан
  • Ошибка При Создании Пинг Понга На Пайтон?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы читайте текст ошибки.
    То так то эдак пишете, то с малой, то с большой буквы название пакета.
    там критично:
    from kivy.app import App
    from Kivy.uix.widget import Widget


    kivy и Kivy для питона различаются. Пакет называется с маленькой буквы, а вы во второй строчке его импортируете с большой. Само собой он не найден.
    Вот вам об этом и в ошибке написано: "No module named 'Kivy'"
    File "C:\Python\main.py", line 2, in
    from Kivy.uix.widget import Widget
    ModuleNotFoundError: No module named 'Kivy'
    Ответ написан
  • Как в Python вычислить ближайшие точки по имеющимся GPS-координатам?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    ищет ближайшие рестораны, координаты которых есть у меня в словаре

    Если ваш бот планирует расти и поддерживать много всяких POI, в том числе помимо ресторанов, то имеет смысл вынести всё это в БД.
    Удобно использовать postgres с расширением postgis. В составе этого расширения есть оптимизированные функции поиска ближайших точек, кроме того в БД удобно хранить сами POI, их можно импортировать из OSM.

    Кроме этого не во всех подобных задачах правильно использовать геометрические метрики для нахождения ближайших точек.
    Какая-то точка может быть ближе к заданной геометрически, но она может оказаться на другой стороне реки, а крюк через мост до нее будет очень большим.
    Для этого вам лучше использовать какое-нибудь решение, учитывающее роутинг. Например OSRM. Такие сервисы зачастую умеют строить матрицы расстояний между точками. OSRM, кстати, отлично развёртывается в докере, на основе данных OSM он может строить как пешие маршруты (если, конечно, ваш регион покрыт пешими тропами в OSM), так и в других модальностях.
    Полезным артефактом от OSRM будет также геометрия маршрута и путевые точки по ходу его следования. Также OSRM в своём API имеет быстрый метод динамической привязки координат к графу дорог. Может пригодиться, скажем, для отслеживания курьера и предупреждения о его прибытии.
    Ответ написан
    Комментировать
  • Почему не записывается лог файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    всё правильно, с "a" должно создаваться. Вы просто, скорее всего, не нашли его. Он создаётся в текущем каталоге. сделайте обычный print(os.getcwd()) рядом с записью, и увидите путь, где лежит ваш файл.

    Но это плохая идея так писать логи. Для этого есть модуль logging. Вот здесь всё очень детально и с примерами изложено.
    Ответ написан
    Комментировать
  • Как вычислить время между записями-событиями в БД?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Если у вас нельзя дважды подряд уснуть не просыпаясь или, наоборот, проснуться дважды не засыпая, то вам помогут оконные функции. Вот, специально посмотрел, они есть в MySQL.
    Вам нужно из событий отфильтровать только чередующиеся засыпания/просыпания, размером окна охватывать соседние две записи, если первая - "засыпание", то это будет период сна, если "пробуждение", то период бодрствования.
    Вроде бы именно то, что вам нужно.

    Как делать запрос из питона вы найдёте в каждом первом примере найденном через гугл.
    Ответ написан
    Комментировать
  • Есть ли компилятор для python в оптимизированный байт-код?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    То есть вы хотите, чтобы хреново написанный питоновский код подвергался оптимизации при трансляции в байткод?
    Плохая идея неявной магией и постобработкой закидывать огрехи в качестве кода.
    Байткод формируется под вполне конкретную виртуальную машину. Производительность вашей программы зависит от качества и эффективности вашего кода, а также от скорости виртуальной машины, исполняющей байт-код. В случае с питоном вы можете воспользоваться Java-машиной перейдя на jython. Это также добавит возможностей для интеграции с подключением java-кода.

    Если в проекте на питоне производительность стала для вас бутылочным горлышком, это значит что либо вы выбрали не тот язык и стоит писать на Си, либо вы плохо работали над архитектурой: не применяли горизонтального масштабирования, неправильно разделили трудоёмкие задачи на отдельные процессы, допустили излишнюю связность или мутабельность, где их можно было избежать воспользовавшись сильными сторонами Питона и обойдя слабые.
    Ответ написан
    Комментировать