Python как определить что windows переключился в ждущий режим

Обновлено: 07.07.2024

Я хочу сделать что-нибудь, когда прекратить скрипт Python на Windows.

Пожалуйста, проверьте мой пример кода. У него есть проблема. когда я нажимаю CTRL + C или Close, cmd window.on_exit () не выполняется. и всплывающее окно windows "python.exe перестал работать, windows проверяет решение проблемы"

Заранее спасибо и извините за плохой английский.

2 ответа

Как @mata предлагает, вам следует использовать модуль atexit, чтобы зарегистрировать функцию, вызываемую при нормальном завершении работы скрипта, то есть не через необработанное исключение Windows, ExitProcess или TerminateProcess ,

Если вам нужно использовать SetConsoleCtrlHandler по какой-то другой причине, сохраните ссылку на обратный вызов, чтобы предотвратить его сборку мусора. В противном случае процесс завершится сбоем (в лучшем случае).

Вы также хотели бы функцию unset_console_ctrl_handler .

К вашему сведению, консоль не является окном "cmd". cmd.exe - это программа консоли пользовательского интерфейса (CUI), которая обычно является %COMSPEC% интерпретатором команд. В этом отношении он ничем не отличается от powershell.exe, python.exe или любого другого консольного приложения.

В консольном окне реализован символьный интерфейс, совместимый с традиционными стандартными операциями ввода-вывода с использованием StandardInput , StandardOutput и StandardError . Существует также функциональный API (в отличие от последовательностей управления терминалами) для создания более сложных текстовых интерфейсов. Каждый символ UCS-2 в буфере консоли имеет такие атрибуты, как цвет и интенсивность.

До NT 6.1 каждая консоль размещалась в потоке процесса системного сервера csrss.exe. В NT 6.1+ каждое консольное окно вместо этого размещается в экземпляре conhost.exe, который является более безопасным, поскольку он не является системным процессом и предоставляет каждому окну консоли отдельный процесс и контекст безопасности. До NT 6.3 процесс связывался с (одной и только одной) подключенной консолью через локальный вызов процедур Windows (LPC). В NT 6.3+ вместо этого используется драйвер устройства ConDrv. Несколько процессов могут использовать одно и то же окно консоли.

Скрипты с расширением .pyw связаны с pythonw.exe, который построен как оконное приложение, которое не наследует и не создает консольное окно. Если вам нужна консоль в этом случае, вы можете выделить новую или присоединить к существующей, используя ctypes для вызова AllocConsole или >.

Вы должны использовать atexit модуль, который позволяет регистрировать выходные хуки без используя ос вызовы конкретных функций.

Я делаю приложение, которое работает большое количество времени. Он использует как 80% из CPU, поэтому пользователь просто запускает это приложение и уходит от клавиатуры. Поэтому я думаю, что мне нужно что-то вроде system api или библиотеки, которая блокирует спящий режим. Я уверен, что он существует. Например, если вы откроете любой видеоплеер на своем OS, ваш (PC, ноутбук) не перейдет в спящий режим, то же самое и в браузере.

Кроме того, то же самое происходит в Android ( WakeLock ) или Windows (SetThreadExecutionState)

Есть ли способ предотвратить переход Mac в спящий режим программно с помощью Objective-C? В разделе I / O kit fundamentals на сайте разработчиков Apple говорится, что драйвер получает уведомление о бездействии / спящем режиме системы, но я не могу найти способ предотвратить спящий режим системы.

Как предотвратить программный переход устройства Android в спящий режим?

Я столкнулся с аналогичной ситуацией, когда процесс занимал достаточно много времени, чтобы выполнить себя, что windows будет hibernate. Чтобы преодолеть эту проблему, я написал сценарий.

Следующий простой фрагмент кода может предотвратить эту проблему. При использовании он попросит windows не спать во время выполнения сценария. (В некоторых случаях, например, когда батарея разряжается, Windows проигнорирует ваш запрос.)

Чтобы запустить скрипт, просто :

Создан образец приложения TK, чтобы держать windows в сознании

Логика в Keep.Awake решит вашу проблему на ubuntu или любом Linux дистрибутиве под управлением Gnome (старом и новом, включая Unity), работает как на Wayland, так и на X. Он прост в использовании.

Поэтому с точки зрения логики сделайте следующее:

  1. Используйте команду DBus через subprocess.Popen (. ), чтобы очистить счетчик сна/приостановки.
  2. Используйте psutil.cpu_percent() для периодического запроса количества использования cpu или просто поместите логику, как только ваша программа закончит делать свое дело, чтобы повторно установить конфигурацию сна.

В качестве альтернативы вы можете просто запустить keepawake.py на поле Linux, на котором вы запускаете свою интенсивную программу cpu, и это решит вашу проблему! Это просто работает!

Пример использования взят с веб-страницы:

Чтобы запустить как фоновую службу и установить минимальную нагрузку CPU как 13%:

Чтобы запустить в качестве фоновой службы и установить 15 мин (900 сек) в качестве времени простоя активности пользователя, прежде чем он определит, что пользователь находится в режиме ожидания:

Для запуска в качестве фоновой службы и установки минимального сетевого трафика в размере 5 КБ (5120 байт):

Для запуска в качестве фоновой службы и установки расписания в спящий режим/приостановку через 1 час (это значение устанавливается только в том случае, если активность пользователя, cpu и сетевой трафик определены как бездействующие) :

Чтобы запустить все вышеперечисленные настройки (network, CPU, User idle, sleep schedule) за один раз, установите путь к лог-файлу "/home/$USER/sleep/log/Keep.Awake/" с подробным выводом:

Есть ли способ предотвратить переход компьютера под управлением OS X в спящий режим из сценария Python?

Может ли устройство android перейти в спящий режим во время телефонного звонка ? Я читал, что устройство действительно переходит в спящий режим, когда устройство простаивает и нет никаких блокировок пробуждения. Но я не уверен, что наличие запущенного вызова объясняет wakelock.

Основываясь на нескольких подходах, которые я нашел в Интернете, я придумал этот модуль ниже. Особая благодарность @mishsx за обходной путь Windows .

Использовать его очень просто. Вы можете выбрать подход декоратора, используя standby_lock или через StandbyLock в качестве контекстного менеджера:

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

Примечание: Все еще есть некоторые предостережения, так как Linux может потребовать привилегий sudo , а OS X ( Darwin ) еще не протестирован.

Windows: просыпайся

Во время поиска в Google я обнаружил, что многие люди используют SetThreadExecutionState , чтобы не дать Windows спать во время выполнения задачи. Пакета не было, поэтому я решил упаковать его, чтобы поместить его в PyPI: wakepy .

Использование дополнительного флага -s также сохранит экран включенным.

Python API

Похожие вопросы:

Пока выполняется копирование, можем ли мы перевести PC в спящий режим на определенный период времени, а затем проснуться и продолжить копирование с помощью скрипта python? Можете ли вы пожалуйста.

Есть ли способ предотвратить переход Mac в спящий режим программно с помощью Objective-C? В разделе I / O kit fundamentals на сайте разработчиков Apple говорится, что драйвер получает уведомление о.

Как предотвратить программный переход устройства Android в спящий режим?

Есть ли способ предотвратить переход компьютера под управлением OS X в спящий режим из сценария Python?

Может ли устройство android перейти в спящий режим во время телефонного звонка ? Я читал, что устройство действительно переходит в спящий режим, когда устройство простаивает и нет никаких блокировок.

Я делаю приложение Android TV и Amazon Fire TV, которое использует WAKELOCK, чтобы предотвратить переход устройства TV в спящий режим. Однако мне нужно отпустить WAKELOCK, когда экран выключается.

Я работаю над приложением отслеживания GPS, в котором мне нужно отслеживать местоположение через 15 секунд. Я использую обработчик для запуска службы из onStartCommand() из класса обслуживания. но.

Существует ли (программный) способ предотвратить переход моего Linux (Ubuntu) в спящий режим во время работы моей программы Python? Я ищу решение, которое позволит мне избежать ручного изменения.

как бы сделать так, чтобы реально засыпал, также как при нажатии на кнопку Сна.

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь


Спящий режим
как в вин7 включить спящий режим? тот самый который был в вин хп? я может его путаю с чем может он.

спящий режим
Существует функция для вхождения в спящий режим и функция ,наоборот, возобновления работы? Спасибо.

Спящий режим
Что будет, если я отключу спящий режим?

Спящий режим
Недавно поменял блок питания на Aerocool 500w, заметил, что в спящем режиме вентилятор бп работает.

а это не выключение разве?

не пробовал.
можете подсказать, как именно нужно передать это в python ?

это будет гибернация?
просто у меня на памяти случаи когда ноутбук, правда другой, из гибернации так и не смог выйти) пока всё начисто не переставили.. гугл мне напомнил, что шутдаун не умеет усыплять..
Ваш вариант может не работать, потому что не достаточно прав. С каким кодом завершения выполняется os.system ? не совсем понял вопрос.
всё что я пишу в коде это:
os.system("rundll32.exe powrprof.dll,SetSuspendState 0,1,0")
ничего в ответ Пайтон не пишет,просто блокируется экран и всё os.system(command) - исполняет системную команду, возвращает код её завершения (в случае успеха 0).
т.е. можно вызов метода обернуть в print и понять, что происходит я бы попробовал запустить консоль от имени администратора и из этой консоли запустить ваш скрипт.

теперь всё срабатывает, но независимо от первого параметра, отвечающего за гибернацию, она всё равно активна
пробовал 0,1,0
пробовал 1,1,0


всё равно сон гибридный

а мне нужен лёгкий сон, который можно прерывать простым движением мышки.

как это сделать?

Добавлено через 1 час 42 минуты
всё, докрутил сам

командная строка от имени админа
далее ввод:
powercfg -hibernate off

в панели управления в настройки электропитания, там и так была отключена гибернация сна
но почему-то всё равно срабатывала

пока не сделал через командную строку

Спящий режим
Если не обращаться к ноутбуку какое-то время, он переходит в спящий режим. Можно ли регулировать.

Спящий режим
После того когда виндовс вошла в спящий режим, я решил её пробудить. Всё стало происходить как при.

Спящий режим
Подскажите как в Windows XP настроить, что бы комьпьютер всегда выходил из спящего режима в 1:00 (в.

Спящий режим
При переходе в спящий режим (нажатие на клавиатуре кнопки sleep), компьютер полностью выключается.


Спящий режим
Подскажите как написать программу которая погружала бы компьютер на определённое время в спящий.


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

Содержание статьи

В Python есть возможность вызвать функцию sleep() для симуляции задержки в выполнении программы. Быть может, вам нужно дождаться загрузки, скачивания или появления графического объекта на экране. Также может потребоваться сделать паузу между вызовами к веб API или запросами к базе данных. В таких случаях поможет добавление вызова функции sleep() в программу.

Главные аспекты данного руководства по вызову sleep() в Python:

  • time.sleep() ; ; ; ;
  • Графический пользовательский интерфейс GUI.

Данная статья предназначена для разработчиков Python среднего уровня, что стремятся повысить свою квалификацию. Если это похоже на вас, приступим!

Вызов sleep() через time.sleep()

В Python есть встроенная поддержка для погружения программы в сон. У модуля time есть функция sleep(), что позволяет отсрочить выполнение вызываемого потока на указанное количество секунд.

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Далее дан пример использования time.sleep() :

При запуске кода из консоли, задержку нужно проводить перед вводом нового оператора в REPL.

На заметку: В Python 3.5 разработчики слегка изменили поведение time.sleep() . Благодаря новой системе вызова sleep() эффект отсрочки будет длиться как минимум на продолжении указанного количества секунд, даже в том случае, если сон прерывается сигналом. Однако, это не касается случаев, если сигнал является признаком вызова исключения.

Вы можете протестировать, как долго продлиться сон с помощью модуля Python timeit:

Здесь модуль timeit запускается с параметром -n , что указывает timeit , сколько раз выполнять последующий оператор. Можно заметить, что timeit выполнил оператор 3 раза, а лучшее время длилось 3 секунды, чего и следовало ожидать.

По умолчанию timeit будет запускать код миллион раз. Если бы вы запустили вышеуказанный код, оставив значение -n по умолчанию, тогда при 3 секундах на итерацию код завис бы примерно на 34 дня! У модуля timeit есть несколько других настроек для командной строки, с которыми можно ознакомиться в документации.

Создадим что-то более практичное. Системному администратору всегда нужно быть в курсе, если какой-то из сайтов упал. Вы бы хотели иметь возможность проверить код состояния сайта регулярно, но запрашивать веб сервер постоянно нельзя, ведь это сильно повлияет на производительность. В Python одним из простых способов совершить такую проверку является использование системного вызова sleep() :

Если ошибок нет, код спокойно выполняется. Вне зависимости от того, что произойдет, программа уходит в сон на 60 секунд. Это значит, что доступ к сайту будет раз за минуту. URL, используемый в примере, содержит ошибки. Ежеминутный вывод на консоли выглядит следующим образом:

Вызов sleep() с декораторами

В некоторых случаях нужно повторно запустить неудачно выполненную в первый раз функцию. Зачастую это происходит, когда требуется повторить загрузку файла ввиду ранней перегрузки сервера. Как правило, никто не хочет делать частые запросы на серверы, поэтому добавление в Python вызова sleep() между каждым запросом предпочтительно.

Другим возможным случаем использования sleep() является необходимость проверки состояния пользовательского интерфейса во время автоматического теста. В зависимости от компьютера, на котором запускается тест, пользовательский интерфейс может грузиться быстрее или медленнее обычного. Это может изменить отображаемое на экране во время проверки программой чего-то.

В данном случае можно указать программе, чтобы та погрузилась в сон на мгновенье и затем проверить все опять через несколько секунд. Это может означать разницу между прохождением или провалом теста.

Для добавления системного вызова sleep() в Python можно использовать декоратор в каждом из данных случаев. Разберем следующий пример:

sleep() является вашим декоратором. Он принимает значение timeout и количество раз для повтора retry , что по умолчанию равняется 3. Внутри sleep() есть другая функция, the_real_decorator() , которая принимает декорируемую функцию.

В конечном итоге самая внутренняя функция wrapper() принимает аргументы и ключевые слова, которые вы передаете декорируемой функции. Здесь все и происходит! Используется цикл while, чтобы повторить вызов функции. Если возникла ошибка, вызывается time.sleep() , увеличивается счетчик попыток retries и повторяется попытка запуска функции.

Теперь переписывается uptime_bot() для использования нового декоратора:

Здесь вы декорируете uptime_bot() с помощью sleep() в 3 секунды. Вы также удалили оригинальный цикл while и старый вызов sleep(60) . Декоратор теперь позаботится об этом.

Другое изменение состоит в добавлении raise внутри блоков, отвечающих за обработку исключений. Это нужно для правильной работы декоратора. Можно также написать декоратор, чтобы он отвечал за ошибки, однако ввиду того, что исключения касаются только urllib , может быть лучше сохранить декоратор в текущем состоянии. В таком случае он будет работать c более широким ассортиментом функций.

На заметку: При желании более подробно узнать о том, как справляться с исключениями в Python, можете ознакомиться со статьей: Обработка исключений в Python

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

Вызов sleep() в потоках

Могут возникнуть ситуации, когда в Python требуется добавить вызов sleep() для потока. К примеру, запуск скрипта миграции для базы данных с миллионами записей. Здесь важно избежать простоя, а также не ждать дольше необходимого для завершения миграции, поэтому можно использовать потоки.

На заметку: Потоки являются одним из методов использования конкурентности в Python. Можно запустить несколько потоков одновременно, чтобы увеличить производительность приложения. Если потоки в Python являются для вас новой темой, ознакомьтесь со статьей модуль threading.

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

Читайте также: