• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

Tharis

[Python] Pequeno script para desligar o PC

10 mensagens neste tópico

Fiz este script para um amigo aqui do P@P que tem problemas em gerir tempo de estudo com tempo no PC. Fiz um script em que ele mete uma hora e o computador avisa aos 5 minutos antes dessa hora que vai desligar o PC. E depois desliga! :)

O código podia estar melhor, mas fiz isto à pressa:

import time
import sys
import os

time_to_shutdown=sys.argv[1]
hours=time_to_shutdown.split(':')[0]
min=time_to_shutdown.split(':')[1]
text="""print("SAI JA' DO PC E VAI ESTUDAR!")
print("VE LA' SE NAO QUERES LEVAR COM O PAU!")
raw_input('<enter> para fechar do aviso')"""

x=0
while True:
    actual_hours=time.strftime("%H")
    actual_min=time.strftime("%M")
    if x==0 and int(actual_hours)==int(hours) and int(min)-int(actual_min)==5:
        file("warn.py",'w').write(text)
        os.system("warn.py")
        os.remove("warn.py")
        x=1
    elif x==1 and int(actual_hours)==int(hours) and int(min)==int(actual_min): break

os.system("shutdown -s")

Fiz isto num ficheiro .pyw

Têm de correr pela consola com o seguinte formato: "python leave.pyw xx:yy" em que xx:yy é a hora:minutos. Se estiverem em Windows é o mesmo só que sem o "python ".

Se calhar, faço um projecto disto para os pais... :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Alguns improvements:

import time, sys, os

hours, min = map(int, sys.argv[1].split(":"))

text="""print("SAI JA' DO PC E VAI ESTUDAR!")
print("VE LA' SE NAO QUERES LEVAR COM O PAU!")
raw_input('<enter> para fechar do aviso')"""

warned = False
while True:
    actual_hours, actual_min = map(int, time.strftime("%H:%M").split(":"))

    if not warned and actual_hours>=hours and min-actual_min>=5:
        open("warn.py",'w').write(text)
        os.system("warn.py")
        os.remove("warn.py")
        warned = True
    elif actual_hours >= hours and min >= actual_min: break
    time.sleep(1)

os.system("shutdown -s")

No entanto, ele falha se eu lhe disser para desligar às 20.00, não mostra o alert :) Isto sem contar que é extremamente ineficiente esse loop (daí ter adicionado o time.sleep(1) para melhorar um pouquito...).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hehe muito engraçado.

Não tive a testar, mas por olho diria que isso pode ser contornado. Se o "estudante" não fechar a janela de aviso, o programa nunca desligará o PC, já que fica a espera. Ou será que estou a ver mal?

Caso se estiver a ver bem, é pôr a forçar o PC mesmo que o "estudante" não feche o aviso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hehe muito engraçado.

Não tive a testar, mas por olho diria que isso pode ser contornado. Se o "estudante" não fechar a janela de aviso, o programa nunca desligará o PC, já que fica a espera. Ou será que estou a ver mal?

Caso se estiver a ver bem, é pôr a forçar o PC mesmo que o "estudante" não feche o aviso.

É só fazer um:

from thread import start_new_thread
start_new_thread(os.system,("warn.py",))

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

manda o script esperar 30 segundos em cada itereção, evita-se estar sempre a correr centenas de milhares de iterações completamente desnecessarias

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

manda o script esperar 30 segundos em cada itereção, evita-se estar sempre a correr centenas de milhares de iterações completamente desnecessarias

Por acaso, tens razão... anyway, eu disse que o código está porco! Já tava com pressa e tal. Se calhar faço um projecto disto para os pais...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É só fazer um:

from thread import start_new_thread
start_new_thread(os.system,("warn.py",))

Mas se puseres numa nova thread o que acontece quando mandas apagar o ficheiro? :D
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se puseres numa nova thread o que acontece quando mandas apagar o ficheiro? :D

Exacto, a melhor opção é mesmo dares um tempo ao aviso passado o qual ele desaparece (time.sleep(30)).

E editei agora os meus map()s, o lambda só lá estava a fazer overhead :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas se puseres numa nova thread o que acontece quando mandas apagar o ficheiro? :D

Não mandas apagar logo. Apagas fora do loop...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas fora do loop ainda podias ir apagar o ficheiro mas ele ainda podia estar a ser executado, tipo o utilizador ignorou-o.

Podiam sempre passar o apagar o ficheiro para dentro da thread também. Mas aí podia acontecer o pc ser desligado sem o pc ter sido apagado. Podiam usar antes ficheiros temporários. Mas a meu ver a melhor forma mesmo era mostrar o aviso sem usar o ficheiro, por a thread logo a mostrar o aviso...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora