Задать вопрос
  • Как осуществить автоматическое обновление программы при ее запуске?

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

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

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

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    NodeMCU (Esp8266) вместе с отладочной платой вроде этой. Там уже и проц поинтереснее и вайфай на борту и проектов в инете куча.
    Но мой вам совет, возьмите максимально подходящий по составу периферии проект из существующих у каких-нибудь зубров DIY вроде Алекса Гувера. Там всё разжевано и по полочкам, есть видосы, есть референсы и ссылки, есть рекомендации проверенных продавцов китайских магазинов с нужными деталями.
    Ответ написан
    Комментировать
  • Как вставить текст на картинку, чтобы он лежал на плоскости, заданной координатами?

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

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

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

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

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Стейджинг и контроль версий не очень подходят т.к. область работ почти по всему ядру CMS и модулей + новые увесистые наработки.

    1. Подходят / не подходят, а если у вас всё это делается без стейджинга и контроля версий, я вам советую продать сайт пока возможность есть со всеми потрохами и поискать себя в другой области. Система контроля версий - это единственное, что потом позволит вам хотя бы задним числом понять кто не чист на руку и отомстить плохими отзывами в профиле.
    2. Не ищите дешевых фрилансеров без репутации и профиля, которым имело бы смысл дорожить.
    3. Держите репозиторий в гитхабе и старайтесь, чтобы разработчик от своего основного эккаунта кодил. Акк должен быть с активностью, историей, иначе что это за разработчик такой? Вообще верно в той поговорке сказано: "не гонялся бы ты, поп, за дешевизной".
    4. Дешевых нонейм-фрилансеров без истории опасно пускать в ядро. Отдавайте их код на ревью ребятам посерьёзнее, с репутацией. Ревью тоже работа, но обойдётся дешевле, чем закодить все эти фичи. За то опытный человек своим глазом глянет. С него потом и спросить можно как это он проглядел вредоносный коммит.
    5. Выносите всё что можно в опенсорс, но контрибьютьте корневой проект сами или через проверенных людей. Тут вам и бесплатные руки (если фичи полезные), илишние глаза для проверки на вшивость.
    6. Не хватает денег на крутых серьёзных разрабов с репутацией, делегируйте им хотя бы составление детального ТЗ и, как я выше уже написал, ревью.
    7. Помните, что порой лучшее - враг хорошего. Умейте выстраивать MVP. По Паретто 80% прибыли вам принесёт 20% фич. Сделайте их хорошо, а остальное, может быть, отпадёт за ненадобностью по факту.
    8. Как говорится "вам пора, и вам пора, с вентиляторным заводом заключать договора". Правильно коллега подметил в соседнем ответе. Вы ж не подпольную крипто-биржу, наверно, там кодите. Можно договора заключать с разрабами в белую. Лишний повод ему не гадить засветив реквизиты и подписавшись.
    Ответ написан
    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. Вот здесь всё очень детально и с примерами изложено.
    Ответ написан
    Комментировать
  • Как зарегистрировать свой qr код?

    trapwalker
    @trapwalker
    Программист, энтузиаст

    Сразу хочу предупредить что я знаю что такое qr код и для чего он нужен. И знаю что есть куча генераторов qr кодов.

    Теперь у меня возникла проблема, а как сделать что-бы при сканировании моего qr кода открывался сайт? Именно моего qr кода.

    Судя по вопросу вы слишком самоуверены в своём "знании".
    Вы путаете. Не сайт привязывается к QR-коду, а QR-код создаётся из ссылки на сайт, из номера телефона или из email, или параметров подключения к wifi.

    Вот сейчас подумал, что, возможно, вы хотели по одному и тому же QR-коду ходить на со временем изменяющуюся страницу? Можно нарисовать QR-код для ссылки, полученной с помощью любого сервиса сокращения URLов, а потом подменять там целевой адрес для редиректа. Это даст вам заодно еще и статистику переходов по ссылке.
    Ответ написан
    4 комментария
  • Как вычислить время между записями-событиями в БД?

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

    Как делать запрос из питона вы найдёте в каждом первом примере найденном через гугл.
    Ответ написан
    Комментировать
  • Какой командой посмотреть расположение программы, установленной через python setup.py install в консоли linux?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Начните с whereis cli_entry_point_name.
    Она покажет что-то вроде:
    /usr/bin/cli_entry_point_name
    Наверно это python-файл. Вы можете убедиться в этом так:
    file /usr/bin/cli_entry_point_name
    Это также может быть симлинк на реальное расположение скрипта, команда file покажет вам реальное его месторасположение.
    Если это питоновский скрипт, загляните вовнутрь, там наверняка импортируется какой-то питоновский модуль.
    pip show module_name
    покажет где лежит библиотека.
    Это также может быть шелл-скрипт или вообще любой скрипт, там может активироваться env-окружение... короче надо смотреть глазами. Вариантов много, нет смысла описывать все.
    Ответ написан
    2 комментария
  • Есть ли компилятор для python в оптимизированный байт-код?

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    С помощью super() можно вызывать любые родительские методы, не только конструктор.
    Кстати, __init__ -- это не конструктор, строго говоря. Он не создаёт инстанс. Инстанс создаётся в __new__, это и есть, фектически, конструктор. А __init__ -- это инициализация. Хотя в общем-то всем пофиг и конструктором его тоже все называют. Для простоты.

    В питоне есть множественное наследование. super создаёт прокси-объект с интерфейсом к предкам.
    Ответ написан