Skip to content

Instantly share code, notes, and snippets.

Created July 3, 2012 18:09
Show Gist options
  • Save anonymous/3041461 to your computer and use it in GitHub Desktop.
Save anonymous/3041461 to your computer and use it in GitHub Desktop.
Überprüfung von Modulen in einem Ordner, auf fehlende Pakete mit der Option diese zu installieren und Ausgabe weiterer Fehlermeldungen.
#!/usr/bin/python
# -*- coding: utf-8 -*-
try:
import sys, os, shlex, subprocess, imp, psutil
check = True
except ImportError:
import sys, os, shlex, subprocess, imp
check = False
PROG = 'modul_control.py'
# Alle Dateien des Ordners in FILE_LIST speichern.
FILE_LIST = set()
PATH = os.path.dirname(os.path.realpath(os.path.abspath(sys.argv[0])))
LIST = os.listdir(PATH)
for files in LIST:
if os.path.isfile(files):
FILE_LIST.add(files)
APT_GET = 'sudo apt-get install -y'
APTITUDE = 'sudo aptitude install -y'
PIP = 'pip install'
COMMAND_QUESTION = 'Welchen Befehl möchten Sie für die\nInstallation \
von Paketen verwenden?\n1: %s\n2: %s\n3: %s'
IMPORT_INFO = 'Das Paket %s wird für das Starten\ndes Python-Modul \
%s benötigt.\nDas Paket %s ist nicht installiert ist!\n\nSoll das \
Paket %s jetzt installiert werden?'
# Programm
# Funktion zur Installation von Paketen
def installation(paket):
for output in install_command:
command_install = output
command_line = '%s %s' % (command_install, paket.lstrip('-'))
args = shlex.split(command_line)
if 'sudo' in args:
print ('\nGeben Sie Ihr Passwort ein!')
subprocess.call(args, shell=False)
# Funktion zur Auswahl des Installation-Befehl
install_command = set()
def command(e_name):
counter = 0
yes = False
while yes != True:
print (COMMAND_QUESTION % (APT_GET.split(None, 2)[1], APTITUDE.split(None, 2)[1], PIP.split(None, 2)[0]))
number = raw_input('Nummer: ')
counter += 1
if number == '1':
install_command.add(APT_GET)
print ('\nSie haben %s gewählt!\n' % APT_GET.split(None, 2)[1])
yes = True
elif number == '2':
install_command.add(APTITUDE)
print ('\nSie haben %s gewählt!\n' % APTITUDE.split(None, 2)[1])
yes = True
elif number == '3' and e_name != 'pip' and check != False:
no_pip()
install_command.add(PIP)
print ('\nSie haben %s gewählt!\n' % PIP.split(None, 2)[0])
yes = True
else:
if counter <= 3:
print ('')
if e_name != 'pip':
print ('Nummer %s existiert nicht!\n' % number)
else:
print ('Nummer %s ist nicht installiert, \nbitte wählen Sie eine ander Option!' % number)
print ('')
else:
print ('Eingabefehler, Abbruch!')
yes = True
sys.exit()
# Funktion zu ImportError für,
# Module die kein Paket für die Installation angeboten bekommen,
# sondern nur den Namen des Moduls.
# Hier werden Pakete aus der apt-Paketliste angeboten.
# Die Auswahl des zu installierenden Paketes,
# muß manuell vorgenommen werden.
def no_name(e_name):
if 'psutil' == e_name:
print ('Das Modul %s wird zur Funktionsfähigkeit \ndieses Moduls benötigt!\n') % e_name
if not 'python' in e_name:
modul = 'python-%s' % e_name
command_line = 'apt-cache search %s' % (modul.lstrip('-'))
question = ('Möchten Sie das Paket %s installieren?\n< ja / nein >: ') % e_name
answer = raw_input(question)
print ('')
args = shlex.split(command_line)
process = subprocess.call(args, shell=False,)
paket = ''
if answer == 'ja':
text = ('\nGeben Sie das zu installierende Paket für %s ein!: ') % e_name
paket = raw_input(text)
print ('')
elif answer == 'nein':
if check != False:
print ('\nInstallation von %s wurde abgebrochen!' % e_name)
else:
print ('\nInstallation von %s wurde abgebrochen!' % e_name)
sys.exit(1)
else:
print ('\nFehlerhafte Eingabe, Installation von %s wurde abgebrochen!' % e_name)
sys.exit(1)
if paket != '':
if modul == 'pip':
install_command.remove
command(modul)
command(modul)
installation(paket)
# Funktion zur Überprüfung ob Modul geladen werden kann
def no_pip():
try:
import pip
check = True
except ImportError, e:
check = False
e_name = e.message.split(' ')[-1]
no_name(e_name)
def no_mod():
try:
import psutil
check = True
except ImportError, e:
check = False
e_name = e.message.split(' ')[-1]
no_name(e_name)
no_mod()
# Funktion zur Überprüfung von Fehlermeldungen
BaseExceptionInfo = set()
NameErrorInfo = set()
def modul_check():
counter = 0
for prog in FILE_LIST:
if '.py' in prog and not '.pyc' in prog and not PROG in prog:
datei = prog
modul = prog.split('.py')[0]
try:
if counter == 0:
no_mod()
imp.load_source(modul, datei)
counter = 1
else:
imp.load_source(modul, datei)
for prog in psutil.process_iter():
if datei in prog.cmdline:
psutil.Process(prog.pid).terminate().wait()
break
print ('Modul %s ist ok!' % datei)
except ImportError, e:
if not 'please install the' in str(e):
e_name = e.message.rsplit(None, 2)[-1]
print '\nFehler in Datei %s mit Modul %s\n' % (datei, e_name)
counter += 1
if counter == 1:
command(e_name)
print ('')
no_name(e_name)
print ('')
else:
e_name = e.message.rsplit(None, 2)[-2]
print '\nFehler in Datei %s mit Modul %s\n' % (datei, e_name)
counter += 1
if counter == 1:
command(e_name)
if 'please install the' in str(e):
paket = e.message.rsplit(None, 2)[1]
if paket:
print (IMPORT_INFO % (paket, datei, paket, paket))
answer = raw_input('< ja / nein >: ')
if answer == 'ja':
installation(paket)
print ('')
elif answer == 'nein':
print ('\nInstallation von %s wurde abgebrochen!' % paket)
else:
print ('\nFehlerhafte Eingabe, Installation von %s wurde abgebrochen!' % paket)
sys.exit(1)
except NameError, e:
e_name = e.message.split('\'')[1]
print '\nFehler in Datei %s mit Modul %s' % (datei, e_name)
with open(datei, 'r') as infile:
for find in infile:
if modul in find:
result = (datei, e)
NameErrorInfo.add(result)
break
except BaseException, e:
result = (datei, e)
BaseExceptionInfo.add(result)
# Funktion zur Auswertung von Fehlermeldungen,
# die nicht ImportError entsprechen.
def error_info():
print ('')
for info in NameErrorInfo:
if info:
print ('NameError:')
print (info)
print ('')
print ('')
for info in BaseExceptionInfo:
if info:
print ('BaseException:')
print (info)
print ('')
print '\nÜberprüfung ist beendet!'
sys.exit()
if __name__ == "__main__":
modul_check()
error_info()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment