weil ich mich zur Zeit mit der Interaktion zwischen Python und dem Betriebssystem (in meinem Falle Linux) auseinandersetze, habe ich mir mal ein kleines Programm geschrieben welches die Quellen von installierten Softwarepaketen herunterladen soll. Ich möchte das hier gern mal vorstellen und mir eure Meinung zur Umsetzung einholen, sprich was kann aus eurer Sicht wo verbessert werden. Schwerpunkt aus meiner Sicht läge besonders auf der Fehlerbehandlung, da ich hier nicht ganz auf einen grünen Zweig komme. Würde mich über Anregungen (auch kritischer Natur) sehr freuen.
Code: Alles auswählen
#!/usr/bin/python3
import os
import sys
import time
from optparse import OptionParser
def read_package_file(file):
with open(file, "r") as file_object:
return build_package_list(file_object)
def query_package_list():
return build_package_list(os.popen("dpkg -l"))
def build_package_list(data_object):
package_list = [line.split()[1] for line in data_object if line[:2] == "ii"]
return package_list
def download_package(package):
base_directory = os.getcwd()
package_directory = "{0}/{1}".format(base_directory, package)
package_status = True
try:
# create a folder for the package source
path_exists = os.path.isdir(package_directory)
if not path_exists: os.mkdir(package_directory)
# go into the package folder
os.chdir(package_directory)
# download the sources -> no error == 0
package_status = bool(os.system("apt-get source -s {0}".format(package)))
except:
pass
finally:
os.chdir(base_directory)
# remove directory in case of an error and created by us
if package_status == True and path_exists == False: os.system("rm -r {0}".format(package_directory))
return package_status
if __name__ == "__main__":
parameter_parser = OptionParser()
parameter_parser.add_option("-b", "--basedir", dest="base_directory")
parameter_parser.add_option("-f", "--file", dest="package_file")
start_parameters = parameter_parser.parse_args()[0]
if start_parameters.base_directory:
try:
os.chdir(start_parameters.base_directory)
except OSError:
# otherwise trigger an exit
sys.exit("Invalid path")
if start_parameters.package_file:
try:
package_list = read_package_file(start_parameters.package_file)
except IOError:
# something goes wrong here, so we leave the program immediately
sys.exit("Error in reading the package file")
else:
package_list = query_package_list()
failed_package_downloads = set()
for package in package_list:
if download_package(package):
failed_package_downloads.add(package)
# convert set -> string
failed_package_downloads = ",".join(failed_package_downloads)
sys.exit("Could not download sources from following packages: {0}".format(failed_package_downloads))