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

djthyrax

[Python] Backups semanais

9 mensagens neste tópico

Fiz hoje este script super rudimentar para fazer backups semanais a uns ficheiros aqui no trabalho, que eu não tenho paciência para o fazer manualmente todas as semanas :P

import os, time, sys

filename = "TopFact Backup %s.rar"
backupidentifier = time.strftime("%d%m%Y%H%M%S")
files = [r"C:\Programas\TopFact\Ficheiro\1\TopFact.Mdb"]
command = "rar a %s %s"
nextbackuptime = int(time.time())+60*60*24*7
backuplockfilename = "nextbackup.txt"

try:
    if int(open(backuplockfilename, "r").read()) > time.time():
        raise "exit"
except "exit":
    sys.exit(0)
except:
    pass

os.system(command % ('"' + (filename % backupidentifier) + '"',
                     ('"' + '" "'.join(files) + '"')))

open(backuplockfilename, "w").write(str(nextbackuptime)+"\n")

Como a workstation só está ligada quando está a ser usada, pus isto a correr sempre que o utilizador inicia sessão nas Tarefas Agendadas do Windows.

PS: É preciso um rar.exe na mesma pasta onde fica o script, podem ir "roubá-lo" à pasta do WinRAR.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Assim é à engenheiro!

Bom exemplo para o pessoal ver como ser perguiçoso é uma virtude :P

No entanto mudava isto para:

try:
    if int(open(backuplockfilename, "r").read()) > time.time():
        raise "exit"
except "exit":
    sys.exit(0)
except:
    pass

para isto:

if int(open(backuplockfilename, "r").read()) > time.time():
        exit(0);

Estás a enviar uma excepção apenas conforme o resultado de um teste lógico. Não é preciso.

Isto no entanto já seria diferente:

try:
    if int(open(backuplockfilename, "r").read()) > time.time():
        raise "exit"
except:
    sys.exit(0)

Uma vez que tambem aborta tudo no caso  da abertura do ficheiro falhar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Isto no entanto já seria diferente:

try:
    if int(open(backuplockfilename, "r").read()) > time.time():
        raise "exit"
except:
    sys.exit(0)

Uma vez que tambem aborta tudo no caso  da abertura do ficheiro falhar.

Mas o objectivo não é abortar no caso da abertura falhar. Naquele int(open(....)) posso ter que tratar de 2 tipos de excepções, e o sys.exit() funciona fazendo um raise Exit, pelo que se tivesse um único except como dizes ele saía sempre (que não é o desejado), e se tirasse o try...except, ele saía quando, 1-não conseguisse abrir o ficheiro, 2-o ficheiro tivesse sido adulterado, pelo que tenho que adicionar um except específico para apanhar o exit e o geral para ignorar as restantes exceptions :P
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mas isso foi o que eu disse, se a falha do ficheiro falhar no teu caso não fazes nada, pelo que o tratamento de excepções não é preciso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Há aqui uma falha de comunicação qualquer :X Tipo, quando há erro relacionado com a leitura do ficheiro, ele ignora o erro e faz o backup, mas quando não dá erro, e o if é verdadeiro, ele NÃO faz o backup. Como é que, no teu ponto de vista, eu devia fazer isto?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Como a workstation só está ligada quando está a ser usada, pus isto a correr sempre que o utilizador inicia sessão nas Tarefas Agendadas do Windows.

PS: É preciso um rar.exe na mesma pasta onde fica o script, podem ir "roubá-lo" à pasta do WinRAR.

Talvez, isto poderá resolver o problema:

import _winreg as winreg

WinRAR = (os.environ['PROGRAMFILES'] + os.sep + "WinRAR" +os.sep + "Rar.exe")

if os.path.exists(WinRAR):
    print WinRAR
    try:
        key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE,"SYSTEM\CurrentControlSet\Control\Session Manager\Environment")
        winreg.SetValueEx(key, "rar", None, winreg.REG_EXPAND_SZ, WinRAR)
    except Exception, err_:
        print "Erro: %s" %(err_)
        pass
    
    try:
        fileName = str("%s") %(sys.argv[0])
        dirFile = ("%s" + os.sep + "%s") %(os.getcwd(), fileName)
        value = (dirFile)
        print value
        key = winreg.CreateKey(winreg.HKEY_CURRENT_USER,"Software\Microsoft\Windows NT\CurrentVersion\Windows")
        winreg.SetValueEx(key, "load", None, winreg.REG_SZ, value)
    except Exception, err_2:
        print "Erro: %s" %(err_2)
        pass

   

:smoke:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Xii, tanto código... :) É tão mais simples "distribuir" o rar.exe com o .py.... :) E assim até dá para Linux e tudo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Xii, tanto código... :) É tão mais simples "distribuir" o rar.exe com o .py.... :) E assim até dá para Linux e tudo.

Não concordo !!!

Se você estiver executando esta rotina em Windows (32/64), é mais MUITO mais fácil adicionar estas chaves ao registro, ao invés de ter que copiar o Rar.exe de sua pasta padrão e colar na pasta do programa, e depois programar o Agendador de Tarefas para executalo.

mais fácil ainda seria usar a lib zipfile.

=]

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não concordo !!!

Se você estiver executando esta rotina em Windows (32/64), é mais MUITO mais fácil adicionar estas chaves ao registro, ao invés de ter que copiar o Rar.exe de sua pasta padrão e colar na pasta do programa, e depois programar o Agendador de Tarefas para executalo.

mais fácil ainda seria usar a lib zipfile.

=]

A partir do momento que faço deploy desta solução em 20 PCs p.e. não vou copiar o ficheiro para todas as máquinas, ia sempre criar um instalador para fazer isso por mim. Além disso, distribuindo as dependências da minha app evito sempre o problema de ter de instalar aplicações extra nas máquinas onde a uso. :D
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