Ответы пользователя по тегу Python
  • Как запустить скрипт python в фоне как демон?

    @MadridianFox
    Web-программист, многостаночник
    Чтобы программа работала "в фоне", она должна либо сама позаботиться о том чтобы не блокировать консоль и не умирать при закрытии баша, либо доверить это специальной программе.

    Как уйти в фон самостоятельно:
    Процессы (работающие программы) имеют идентификаторы и знают кто их запустил, посредством хранения id родительского процесса. Т.о. у нас есть дерево процессов. Родительский процесс может управлять дочерними, и он должен при своём завершении завершать и свои дочерние процессы. Если он этого не сделает, то дочерний процесс сменит родителя на процесс с id = 1, т.е. на init процесс. Поэтому чтобы уйти в фон, ваша программа должна всего лишь остановить её родительский процесс.
    Проблема в том, что родительский процесс для программы, которую вы запускаете в консоли - это сама консоль и нам не надо чтобы она закрылась.
    Поэтому уходящие в фон программы перед остановкой родителя увеличивают уровень вложенности - т.е. запускают свою копию, и эта копия, будучи дочерней для первого процесса программы, убивает уже не баш, а вспомогательный родительский процесс.
    Другой момент - это отвязаться от консоли. Тут всё просто - надо перенаправить stdin, stderr и stdout в файлы.
    Ну и наконец надо позаботиться об управлении демоном, ведь пока что нам не остаётся ничего другого, кроме как посылать ему сигналы командой kill. Чтобы реализовать более понятные команды, надо сделать две вещи:
    1) во время ухода в фон сохранить в файл pid результирующего процесса
    2) написать немного кода в самой программе или во вспомогательном скрипте, который, при вызове его в консоли, будет читать pid из файла и манипулировать процессом.

    Такая функциональность часто выделяется в отдельную библиотеку, можно поискать в документации или на гитхабе.

    Другой вариант - использовать вспомогательные программы.
    С одной стороны у нас есть возможности самого баша - jobs т.е. фоновые процессы, которые однако умирают при закрытии консоли. Чтобы это обойти есть команда disown и программы nohup и setsid.
    Они позволяют так или иначе получить процесс отвязанный от баша. Однако управлять процессом можно будет только сигналами.
    С другой стороны есть менеджеры процессов. Например supervisord или pm2. Это такие программы, которые умеют уходить в фон и умеют, уже будучи демоном, запускать другие программы и управлять ими.

    Ну и наконец всегда есть главный менеджер процессов вашего компьютера/сервера - это система инициализации, которая сейчас почти везде - systemd. Делает то же самое что и обычный менеджер процессов, но ещё и позволяет управлять последовательностью запуска процессов.

    Итог: выбирать способ демонизации процесса необходимо исходя из стабильности его работы. Если это сервер, который должен работать месяцами и запускаться при старте системы - то надо использовать систему инициализации. Так делают Nвеб-сервера, базы данных и всякие капитальные сервисы.
    Если процессы более динамичные и их надо периодически запускать и останавливать, то лучше взять менеджер процессов.
    Если это совсем уж мимолётное желание запустить программу в фоне, пусть поработает а там остановлю, то можно не заморачиваться и отвязать её от баша тем или иным способом.

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

    @MadridianFox
    Web-программист, многостаночник
    Внимательно посмотрите на функцию test. Она принимает event, но печатаете вы btn. Откуда там btn? Информацию о кнопке вы должны брать из event, а переменная btn скорее всего содержит то, что в неё было записано на последней итерации цикла.
    Ответ написан
  • Как сохранить ключ кириллицей в config.ini?

    @MadridianFox
    Web-программист, многостаночник
    Попробуйте сначала конвертировать строку в utf-8, а потом использовать её как ключ.

    Как вариант - сменить кодировку конфига на cp1251 или koi8r, ну и ключи перед записью тоже конвертировать в соответствующую кодировку.
    Ответ написан
    4 комментария
  • Как пронумеровать переменные в переборе?

    @MadridianFox
    Web-программист, многостаночник
    Используйте массив
    Ответ написан
    Комментировать
  • Почему if в lambda работает нестандартно?

    @MadridianFox
    Web-программист, многостаночник
    Всё в порядке. Просто в питоне вместо тернарного оператора используется конструкция
    variable = value_1 if test else value_2
    Что аналогично традиционному тернарного оператору
    variable = test ? value_1 : value_2
    Работает это не только в лямбдах, а везде.
    Ответ написан
    Комментировать
  • Можно ли писать вирусы на python?

    @MadridianFox
    Web-программист, многостаночник
    Вирус - только на компилируемых в нативный машинный код языках. В основном на ассемблере и си. Дело в том что вирус это код, который умеет записать себя в почти программу, которую найдет на диске. И записать код в exe файл это совсем не то же самое что дописать скрипт на php или python.
    Ответ написан
  • Как выбрать архитектуру приложения с учетом необходимости использования нескольких языков программирования?

    @MadridianFox
    Web-программист, многостаночник
    Вы не сказали что за приложение. Если это сервер, то делайте микросервисы на чём хотите. Если более-менее нагруженное десктопное приложение - то ищите способы вызвать код на каждом языке из, допустим, С/С++. Если не сильно требовательное к производительности десктопное приложение, то можно через stdout или соккеты данные передавать между несколькими приложениями на разных языках (как это в AI Russian Cup делается).
    Ответ написан
    4 комментария
  • Как подобрать примитивный парсер?

    @MadridianFox
    Web-программист, многостаночник
    Вы хотите регулярные выражения, но не хотите регулярные выражения потому что они сложные.
    Ок, просто не используйте все возможности регулярных выражений.
    Ваш пример можно описать регуляркой вот так: /<([\w-_]+)\s+src="([^"]+)">/
    Ответ написан
  • Почему не работает мой selenium script на facebook?

    @MadridianFox
    Web-программист, многостаночник
    Может просто фейсбук не хочет чтобы по нему боты лазили. Причём такие наглые)
    Ответ написан
    Комментировать
  • Какой язык программирования выбрать в моем случаи?

    @MadridianFox
    Web-программист, многостаночник
    Очень большой пласт информационной безопасности завязан на достаточно низкоуровневом программировании, ведь именно на низком уровне происходит преодоление систем безопасности.
    Поэтому если хотите продолжать учиться по выбранному направлению - учите плюсы.
    Защитить диплом можно и с PHP, если правильно сформулировать тему, но некоторые предметы можно будет понять только если знаешь С/С++/ассемблер.
    Ответ написан
    Комментировать