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

M@KO

[Python] Executar sudo aptitude

13 mensagens neste tópico

Um programa que faz o upgrade, update, search e install com o sudo aptitude:

#COMSUDO
#coded by Mako
#Abril de 2008

import os
import sys

def limpar():
       os.system("clear")

def sair():
       limpar()
       print "Ate a proxima..."
       sys.exit()

def opcao_errada():
       print "Opcao inexistente"

def update():
       os.system("sudo aptitude update")

def upgrade():
       os.system("sudo aptitude upgrade")

def procura():
       chave = raw_input("Digite o que pretende procurar: ")
       comando = "sudo aptitude search " + chave
       os.system(comando)

def instala():
       chave = raw_input("Digite o que pretende instalar: ")
       comando = "sudo aptitude install " + chave
       os.system(comando)

def main():
       limpar()
       while true:
               print ""
               print "O que pretende fazer?"
               print "1 --> Update do sistema"
               print "2 --> Upgrade do sistema"
               print "3 --> Procurar"
               print "4 --> Instalar"
               print "0 --> Sair"

               opcao = raw_input()
               if opcao == "1":
                       update()
               elif opcao == "2":
                       upgrade()
               elif opcao == "3":
                       procura()
               elif opcao == "4":
                       instala()
               elif opcao == "0":
                       sair()
               else:
                       opcao_errada()

main()

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

3 coisas:

-> 1º Usa o GeShi: mete o código entre as tags [code"=Python"] [/"code"] (sem aspas)

-> No loop while não precisas do "fim=0 e fim==0" podes pôr "while True:"

-> E para a password? Como é?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado pelas dicas. Ja editei o post, ja usei o geshi e alterei o ciclo para  while true. nao sabia esta do true por isso tive de me desenrascar ;)

Quanto a pass... era pra por aquilo a pedir a pass mas ao executar o prog o proprio pc faz isso, por isso achei desnecessario :hmm:

:thumbsup:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a usar as funções como um "armazém". Porque não experimentas uma classe? :thumbsup: Ou então as funções de uma só linha, tipo a tua update, pões directamente no código principal da main.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sou novato nisto do python... nao sei fazer classes  :wallbash:  por enquanto:)

Ou então as funções de uma só linha, tipo a tua update, pões directamente no código principal da main.

Tas a dizer pra fazer assim:

os.system("sudo aptitude search " + chave)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Versão reduzida com exactamente as mesmas funções só para ajudar  :biggrin:


import os       
def executa(x):
    try:
        os.system(x)
    except:
        print "Alguma coisa correu mal, tem aptitude?"


os.system("clear")
while True:
    print """
O que pretende fazer?
1 --> Update do sistema
2 --> Upgrade do sistema
3 --> Procurar
4 --> Instalar
0 --> Sair"""

    opcao = raw_input()
    if opcao == "1":
        executa("sudo aptitude update")
    elif opcao == "2":
        executa("sudo aptitude upgrade")
    elif opcao == "3" or opcao == "4" :
        
        nome="search"
        display="pesquisar"
        if opcao=="4":
            nome="install"
            display="instalar"
                        
        chave = raw_input("Digite o que pretende %s: " %display)
        comando = "sudo aptitude %s %s " %(nome, chave)
        executa(comando)
    elif opcao == "0":
        executa("clear")
        print "Ate a proxima..."
        quit()
    else:
        print "Opcao inexistente"


0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ta fixe newbeen. achei foi esta parte um bocado confusa


    elif opcao == "3" or opcao == "4" :
        
        nome="search"
        display="pesquisar"
        if opcao=="4":
            nome="install"
            display="instalar"
                        
        chave = raw_input("Digite o que pretende %s: " %display)
        comando = "sudo aptitude %s %s " %(nome, chave)
        executa(comando)

]

E  ja agora ...

Estás a usar as funções como um "armazém". Porque não experimentas uma classe? :P Ou então as funções de uma só linha, tipo a tua update, pões directamente no código principal da main.

... da me ai um exemplo de uma class pra eu aprender a fazer isso.

;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para reproduzir fielmente o efeito que tu tens, podes usar algo assim

import os
import sys

class Apt:
def limpar(self):
	os.system("clear")
def sair(self):
	self.limpar()
	print "Ate a proxima"
	sys.exit()
def opcao_errada(self):
	print "Opcao inexistente"
def update(self):
	os.system("sudo aptitude update")
def upgrade(self):
	os.system("sudo aptitude upgrade")
def procura(self):
	chave = raw_input("Digite o que pretende procurar: ")
	comando = "sudo aptitude search" + chave
	os.system(comando)
def instalar(self):
	chave = raw_input("Digite o que pretende instalar: ")
	comando = "sudo aptitude install " + chave
	os.system(comando)

Depois podias usar algo do género:

apt_client = Apt()
apt_client.update()
apt_client.upgrade()

etc.

Por acaso tenho aqui uma versão que fiz que tem umas coisas um pouco mais diferentes (tracebacks e o caraças), por isso não vou fazer spoilers ;) (É praticamente igual ao teu programa nas coisas que faz).

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Epa, tao mas se nao te importares poe aqui essa tua versao pra eu tb aprender a fazer tracebacks e o caracas  ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

import os
import warnings
import subprocess

class Apt:
    def __init__(self):
        if os.environ["LOGNAME"] != "root":
            warnings.warn("User is not root")
            self.is_root = 0
        else:
            self.is_root = 1

    def _run_command(self, command): # Internal Command
        "Runs a command with subprocess.call module"
        try:
            subprocess.call(command, shell=True)
        except OSError:
            print "File or program not found."
        except:
            import traceback
            print "Bad Voodoo happened."
            print "Dumping information on screen."
            print "----------------------------------------------"
            traceback.print_exc()
            print "----------------------------------------------"
            if raw_input("Executar PDB? ").lower() in ("sim", "s", "yes", "y"):
                import pdb
                pdb.set_trace()

    def search(self, package):
        "Search for the package's name with apt-cache search"
        print "apt-cache search %s" % package
        self._run_command("apt-cache search %s" % package)

    def install(self, package):
        "Install the package with apt-get"
        if self.is_root:
            self._run_command("apt-get install %s" % package)
        else:
            self._run_command("sudo apt-get install %s" % package)

    def update(self):
        "Runs apt-get update"
        if self.is_root:
            self._run_command("apt-get update")
        else:
            self._run_command("sudo apt-get update")

    def upgrade(self, dist_upgrade=0):
        "Runs apt-get upgrade. If dist_upgrade is 1, then use apt-get dist-upgrade"
        if self.is_root:
            if dist_upgrade:
                self._run_command("apt-get dist-upgrade")
            else:
                self._run_command("apt-get upgrade")
        else:
            if dist_upgrade:
                self._run_command("sudo apt-get dist-upgrade")
            else:
                self._run_command("sudo apt-get upgrade")

def main():
    apt_client = Apt()
    done = 0
    while not done:
        print """
1) Search
2) Install
3) Update
4) Upgrade
5) Dist-Upgrade
6) Quit
"""

        choice = raw_input(">> ")
        if choice == "1":
            apt_client.search(raw_input("Name: "))
        elif choice == "2":
            apt_client.install(raw_input("Name: "))
        elif choice == "3":
            apt_client.update()
        elif choice == "4":
            apt_client.upgrade()
        elif choice == "5":
            apt_client.upgrade(dist_upgrade=1)
        elif choice == "6":
            done = 1
        else:
            print "Unknown Option!"

main()

Tal como disse, é praticamente igual ao teu, excepto no facto de verificar se o utilizador está como root ou não (porque o sudo não funciona em todas as debian-based distros), na opção de usar o dist-upgrade em vez de upgrade, usar o subprocess.call em vez de os.system e o apt-get/install em vez do aptitude.

O menu foi feito assim à pressa, porque quando fiz isto não cheguei a fazer um menu para ele ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

ta fixe newbeen. achei foi esta parte um bocado confusa]

Qual é a tua duvida nesse pedaço de código?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Newbeen

Eu percebi tudo, so que a primeira vista vi um if = 4  dentro de um elif =3 ou 4 e fiquei um bocado admirado. Mas ja vi que isso evita que escrevas 2 vezes as outras 3 linhas de codigo. e depois ainda nao sabias que se podia usar o "&" em vez do "+"

ta fixe

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