Stilfrage

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Leonidas,

ich poste gleich die Nonplusultraversionklasse in den Codesnippets.
Das ganze ist natürlich für ein eigenes Version-Modul gedacht und würde dann einheitliche Versionsverarbeitung erlauben.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@ leonidas
über optparse bin ich in den letzten Tagen auch gestolpert (hier im Forum) aber erst ist getopt dran.

@Dookie
Du nimmst mir meinen Vorschlag vorweg: Diese Klasse gehört in die Codesnippets.
Aber für mein Skript ist das dann doch etwas zu wuchtig[1].
Ansonsten Danke.

cu Sebastian

[1] wenn ich mal groß bin und mit großen Programmen die Weltherrschaft an mich reiße werde ich das nur mit deiner Nonplusultraversionklasse machen :-)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Dookie hat geschrieben:ich poste gleich die Nonplusultraversionklasse in den Codesnippets.
Das ganze ist natürlich für ein eigenes Version-Modul gedacht und würde dann einheitliche Versionsverarbeitung erlauben.
Nett. Wie wärs mit Verwalung von CVS und SVN $Id$ Strings?
Mr_Snede hat geschrieben:@ leonidas
über optparse bin ich in den letzten Tagen auch gestolpert (hier im Forum) aber erst ist getopt dran.
Ich würde gleich mit getopt anfangen, ich nutze es seit Python 2.3 als es in die stdlib kan, und habe sowas vorher nie gemacht. Vielleicht interessiert dich ja noch getargs ;)
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@ Leonidas
Ich würde gleich mit getopt anfangen ...
Das habe ich doch auch vor. Oder hast du dich nur vertippt und optparse gemeint?

Ich nehme getopt einfach weil in meiner Hardware Doku schon die Lesezeichen drinstecken.
Optparse werde ich aber auch noch ausprobieren.
Aber erst, wenn ich mir 'ne GUI zu dem Skript gebaut habe.
Oder auch mehrere, mit disem Script wollte ich mal ein paar GUI-Toolkits ausprobieren.

cu Sebastian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mr_Snede hat geschrieben:@ Leonidas
Ich würde gleich mit getopt anfangen ...
Das habe ich doch auch vor. Oder hast du dich nur vertippt und optparse gemeint?
Notiz für mich: Erst denken dann schreiben. Ja ich habe optparse zum anfangen gemeint.
Mr_Snede hat geschrieben:Ich nehme getopt einfach weil in meiner Hardware Doku schon die Lesezeichen drinstecken.
Optparse werde ich aber auch noch ausprobieren.
Aber erst, wenn ich mir 'ne GUI zu dem Skript gebaut habe.
Oder auch mehrere, mit disem Script wollte ich mal ein paar GUI-Toolkits ausprobieren.
Was die GUI Toolkits angeht kann ich dir auch ein paar Tipps geben (kann dir fast jeder in diesem Forum *g*).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Ich würde optparse vorziehen. Es sei denn Du willst lernen, wie man so etwas im "C-Stil" programmiert. Ausser das optparse "objektorientierter" und damit IMHO auch lesbarer ist als getopt, kann man auch automatisch eine Hilfe mit -h bzw. --help aus den Optionen generieren lassen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Jup. Bis auch Rückwährtskompatibilität gibt es keinen Grund getopt zu verwenden. Und wenn du es mal wirklich für Python 2.2 brauchst - Optik ist das gleiche und geht ab py 2.2
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ganz ruhig Jungs!
Ich probiere mich gerade an optparse.
habe dazu schon ein wenig Code vom gerold[1] stiebitzt.

cu Sebastian

[1] http://python.sandtner.org/viewtopic.php?t=1811
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe auch noch ein Programmmit optparse, da kannst du auch noch was rausnehmen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ich habe das Gefühl, optparse ist etwas zu hoch für mich.
Ich habe wie gesagt beim gerold abgeschaut und die Doku zu optparse/optik durchgearbeitet.
@Leonidas: dein Prog habe ich mir auch ageschaut, aber leider nicht genug verstanden um es bei mir anwenden zu können.

Unten habe ich mal den Code gepostet, wie weit ich gekommen bin.
Leider gibt es eine Fehlemeldung:

Code: Alles auswählen

>python -u tk-images2thumbs0-0-4.py
  File "tk-images2thumbs0-0-4.py", line 36
    print "options: " options.thumb_height
                            ^
SyntaxError: invalid syntax
Ich möchte erst einmal als Parameter nur thumb_height und den usage-Text haben.

Also wie greife ich auf den Parameter thumb_height zu (versucht habe ich es bei [1] und [2]).
Ich möchte in main() wenn ein Parameter übergeben wurde every_image_in_folder() mit diesem aufrufen ansonsten soll der default Wert benutzt werden.

Bis denn Sebastian

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

import sys, os, Image, optparse


__VERSION__ = "0.0.3"


def parse_options():
    """
    parses and returns commandline options
    """

    #Usage-Text angeben und Parser-Objekt erzeugen
    usage = "\n    %prog [thumb_height] \n\n" + \
            "    generates a thumbnail for every pic in a folder \n" + \
            "    by Sebastian Koch 2004 "
    version = "%prog " + __VERSION__
    parser = OptionParser(usage = usage, version = version)

    parser.add_option("-y", "--thumb_height",
        action="store", type="int", dest="thumb_height", default = 100,
        help = "(in pixel) used to calculate thumb_width by aspectratio of inputpic --> default = 100" )

    #parse options
    (options, args) = parser.parse_args()

    # shows help if there are no arguments  
    if len(args) == 0:
        parser.print_help()
        # sys.exit(0) # stop the programm.
    #just for testing ------------------------------------------- [1]
    else:
        print "options: " options.thumb_height 

    return (options, args)


def create_thumb(file_full_path, thumb_height):
    """ creates a thumb of a pic by a given height with original aspectratio
        Paramters:
            file_full_path = path/to/file.ext
            thumb_height =  (in pixel) used to calculate thumb_width by aspectratio of inputpic
    """

    no_extension = os.path.splitext(file_full_path)[0]

    im = Image.open(file_full_path)
    original_width, original_height = im.size
    thumb_width = thumb_height * original_width / original_height
    im.thumbnail((thumb_width, thumb_height), Image.ANTIALIAS)
    im.save(no_extension + "-thumb.jpg", "JPEG")

    print "Thumb created:"
    print "--> " + no_extension+ "-thumb.jpg"


def every_image_in_folder(input_folder, thumb_height):
    """ walks through a given folder and calls create_thumb() for every image
        Paramters:
            inputfolder = folder with original pics
            thumb_height = used to call create_thumb()
    """
    for this_file in os.listdir(input_folder):
        create_thumb(os.path.join(input_folder, this_file), thumb_height)


def main():

    #Optionen und Argumente parsen
    #(options, args) = parse_options()
    #print "options-in-main: " options.thumb_height #------------------------------------------- [2]

    pic_search_path = "/home/sabba/in/pic/"

    every_image_in_folder(pic_search_path, thumb_height=100)

if __name__ == '__main__':
    main()
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi Mr_Snede,

hast dir wohl die Zeile 36 nicht genau angeschaut?
Da fehlt einfach ein "," zwischen "options: " und options.thumb_height.


Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Und wenn OptionParser aus dem richtigen Namensraum kommt, geht es sogar einwandfrei:

Code: Alles auswählen

def parse_options():
    """parses and returns commandline options"""

    #Usage-Text angeben und Parser-Objekt erzeugen
    usage = "\n    %prog [thumb_height] \n\n" + \
            "    generates a thumbnail for every pic in a folder \n" + \
            "    by Sebastian Koch 2004 "
    version = "%prog " + __VERSION__
    parser = optparse.OptionParser(usage = usage, version = version)

    parser.add_option("-y", "--thumb_height",
        action="store", type="int", dest="thumb_height", default = 100,
        help = "(in pixel) used to calculate thumb_width by aspectratio of inputpic --> default = 100" )

    #parse options
    (options, args) = parser.parse_args()

    # shows help if there are no arguments 
    if len(args) == 0:
        parser.print_help()
        # sys.exit(0) # stop the programm.
    #just for testing ------------------------------------------- [1]
    else:
        print "options: ", options.thumb_height

    return (options, args)
Btw: __version__ sollte klein sein, denn Python macht einen Unterschied bei sowas, und die meisten Programmierer nutzen __version__.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@ Dookie:
Wie dumm von mir, solch einen Fehler hätte ich eigentlich selbst finden müssen. Aber ich habe wohl zu lange vorm Rechner gesessen. Dank dir.

@ Leonidas:
__version__ hatte ich groß geschrieben, weil es während der Laufzeit nicht verändert wird also statisch ist.
Hier im Forum hat jemand gesagt er würde statische Variablen groß schreiben, das finde ich sinnig also habe ich sie groß geschrieben.

Das mit dem Namensraum für OptionParser in parse_options() habe ich selbst herausgefunden (stolz sei :-), nachdem ich Dookies Korrektur umgesetzt habe und der Interpreter mir eben diesen Fehler präsentierte.

Was allerdings noch nicht läuft ist:

Code: Alles auswählen

def parse_options():
    ...
    # shows help if there are no arguments 
    if len(args) == 0: 
        parser.print_help() 
        # sys.exit(0) # stop the programm. 
    #just for testing ------------------------------------------- [1] 
    else: 
        print "options: ", options.thumb_height
Im Moment wird die Hilfe und usage bei jedem Durchlauf angezeigt, ich hätte sie gerne nur dann angezeigt, wenn keine Komandozeilen Parameter übergeben werden.

cu Sebastian
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mr_Snede hat geschrieben:__version__ hatte ich groß geschrieben, weil es während der Laufzeit nicht verändert wird also statisch ist.
Hier im Forum hat jemand gesagt er würde statische Variablen groß schreiben, das finde ich sinnig also habe ich sie groß geschrieben.
__version__ hat aber einen etwas speziellen Status, was schon durch die zwei __ angedeutet wird. Dabei gibt es keine Konstanten in Python, somit kann man nicht von statischen Variablen (ist ein Widerspruch in sich) sprechen.
Mr_Snede hat geschrieben:Im Moment wird die Hilfe und usage bei jedem Durchlauf angezeigt, ich hätte sie gerne nur dann angezeigt, wenn keine Komandozeilen Parameter übergeben werden.
Auch kein Problem:

Code: Alles auswählen

def parse_options():
    """parses and returns commandline options"""

    #Usage-Text angeben und Parser-Objekt erzeugen
    usage = "\n    %prog [thumb_height] \n\n" + \
            "    generates a thumbnail for every pic in a folder \n" + \
            "    by Sebastian Koch 2005 "
    version = "%prog " + __version__
    parser = optparse.OptionParser(usage = usage, version = version)

    parser.add_option("-y", "--thumb_height",
        action="store", type="int", dest="thumb_height", default = 100,
        help = "(in pixel) used to calculate thumb_width by aspectratio of inputpic --> default = 100" )

    #parse options
    (options, args) = parser.parse_args()

    # shows help if there are no arguments 
    if len(sys.argv) <= 1:
        parser.print_help()
        # sys.exit(0) # stop the programm.
    #just for testing ------------------------------------------- [1]
    else:
        print "options: ", options.thumb_height

    return (options, args)
Man muss sich ja nicht immer auf ein Modul festfahren, alte Tricks wie sys.argv gehen immernoch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

@Leonidas
mit sys.argv habe ich es hinbekommen, danke.
statischen Variablen (ist ein Widerspruch in sich)
Jau das tut mir beim Lesen selbst in den Augen weh ;-)

Ich werde noch den Suchpfad für Bilder als möglichen Übergabeparameter einbauen und dann mein Werk posten.
Dann kann ich mich zum Wochenende ans GUI machen (freu).

cu Sebastian
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Wie benutze ich mit optparse Listen als Parameter/Defaultwert?
Wenn ich bei [1] type="string" angebe meckert der Interpreter:

Code: Alles auswählen

TypeError: cannot concatenate 'str' and 'list' objects
Was ich ja nachvollziehen kann da ja eine Liste kein String ist sondern in diesem Fall nur Strings enthält.

Einen String wie etwa "jpg-png-..." zu benutzen und den dann wieder in eine Liste aufzusplitten kann doch nicht der einzige Weg sein.

cu Sebastian

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

import sys, os, Image, optparse, string

def parse_options():

# ... gekürzt

    # create parser object
    parser = optparse.OptionParser()

# ... gekürzt

    parser.add_option("-p", "--pic_list",
        action="store", 
        type="??????", # <----------------------- [1]
        dest="pic_list",
        default = ["jpg", "jpeg", "jp2", "png", "gif", "bmp", "tiff"],
        help = "Image format that will be processed \n --> default = jpg, jpeg, jp2, png, gif, bmp, tiff")


# ... gekürzt

def main():
    #Optionen und Argumente parsen
    (options, args) = parse_options()

    every_image_in_folder(options.pic_search_directory, options.thumb_height, options.pic_list)



if __name__ == '__main__':
    main()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Wie wärs denn damit?

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

import sys, os, optparse

def parse_options():
    parser = optparse.OptionParser()

    parser.add_option("-p", "--pic_list",
        action="store",
        type="string", # <----------------------- [1]
        dest="pic_list",
        default = "jpg, jpeg, jp2, png, gif, bmp, tiff",
        help = "Image format that will be processed \n --> default = jpg, jpeg, jp2, png, gif, bmp, tiff")
    (options, args) = parser.parse_args()
    options.pic_list = options.pic_list.split(',')
    print options.pic_list

def main():
    parse_options()

if __name__ == '__main__':
    main()
Wer gibt denn schon eine Liste wie ['png', 'psd', 'xbm', 'xpm', 'svg'] als commandline Parameter an? da ist es doch besser png,psd,xbm,xpm zu nehmen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Dank an Leonidas und den anderen.
Mittlerweile habe ich alle geplanten Funktionen implementiert, jetzt muss ich noch etwas testen und dann werde ich mal dazu eine kleine GUI zu bauen.

os.listdi() gibt ja auch Ordner aus. Daraus ein Thumbnail zu machen ist ja etwas unsinnig. Deswegen habe ich mir folgendes[1] ausgedacht um die Ordner zu überspringen:

Code: Alles auswählen

for this_file in os.listdir(input_folder): 
        if os.path.isfile(os.path.join(input_folder, this_file)) == 1:
        ...
        else: 
            print "\n! " + os.path.join(input_folder, this_file) + " is a folder not a file"
Ist das eine übliche Vorgehensweise? Wenn nein wie währt ihr das angegangen?
Habt ihr sonst noch Anmerkungen vielleicht in Hinblick auf's kommende GUI?

Cu Sebastian

Hier mal die aktuellste Version:

Code: Alles auswählen

#!/usr/bin/python
# -*- encoding: latin-1 -*-

import sys, os, Image, optparse, string


__version__ = "0.0.5"



def parse_options():
    """
    parses and returns commandline options
    """
    #define usage-text
    usage = "\n    %prog [thumb_height] \n\n" + \
            "    Description: \n" + \
            "    Generates a thumbnail for every pic in a folder \n" + \
            "    by Sebastian Koch 2004 "
    version = "%prog " + __version__

    # create parser object
    parser = optparse.OptionParser(usage = usage, version = version)

    parser.add_option("-y", "--thumb_height",
        action="store", type="int", dest="thumb_height", default = 100,
        help = "(in pixel) used to calculate thumb_width by aspectratio of inputpic --> default = 100")


    parser.add_option("-p", "--pic_list",
        action = "store", type = "string", dest = "pic_list", default = "jpg,jpeg,jp2,png,gif,bmp,tiff",
        help = "Image format that will be processed --> default = jpg, jpeg, jp2, png, gif, bmp, tiff")

    parser.add_option("-d", "--directory",
        action="store", type="string", dest="pic_search_directory", default = os.getcwd(),
        help = "Path where the pictures lay to be 'thumbnaild' --> default = current working directory")


    #parse options
    (options, args) = parser.parse_args()

    options.pic_list = options.pic_list.split(',')
    #print options.pic_list

    if len(sys.argv) <=1:
        print "Running without Arguments by using following defaults:"
        print "-->Thumb_heigt = 100,  pic_list = jpg, jpeg, jp2, png, gif, bmp, tiff"
        print "--> pic_search_directory = ", os.getcwd(), "\n"
        print "For help run: ", sys.argv[0], "-h or --help \n\n"
    else:
        #print "height used for thumbgenerating: ", options.thumb_height
        print "For help run: ", sys.argv[0], "-h or --help \n\n"

    return (options, args)



def create_thumb(file_full_path, thumb_height):
    """ creates a thumb of a pic by a given height with original aspectratio
        Paramters:
            file_full_path = path/to/file.ext
            thumb_height =  (in pixel) used to calculate thumb_width by aspectratio of inputpic
    """
    no_extension = os.path.splitext(file_full_path)[0]

    im = Image.open(file_full_path)
    original_width, original_height = im.size
    thumb_width = thumb_height * original_width / original_height
    im.thumbnail((thumb_width, thumb_height), Image.ANTIALIAS)
    im.save(no_extension + "-thumb.jpg", "JPEG")

    print "\n" + "-"*10 + " Thumb created:"
    print "height x width: " +"[Original:", original_height, "x", original_width, "] -" + " [Thumb:", thumb_height, "x", thumb_width,  "]"
    print "--> " + no_extension+ "-thumb.jpg "



def every_image_in_folder(input_folder, thumb_height, pic_list):
    """ walks through a given folder and calls create_thumb() for every image
        Paramters:
            inputfolder = folder with original pics
            thumb_height = used to call create_thumb()
    """
    for this_file in os.listdir(input_folder):
        if os.path.isfile(os.path.join(input_folder, this_file)) == 1: <------------------------------------[1]
            if string.lower(os.path.splitext(this_file)[1][1:]) in pic_list:
                create_thumb(os.path.join(input_folder, this_file), thumb_height)
            else:
                print "! " + this_file + " is not a pic! Or not defined in the pic_list"
        else:
            print "\n! " + os.path.join(input_folder, this_file) + " is a folder not a file"



def main():
    #parse options and arguments
    (options, args) = parse_options()

    every_image_in_folder(options.pic_search_directory, options.thumb_height, options.pic_list)



if __name__ == '__main__':
    main()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mr_Snede hat geschrieben:os.listdi() gibt ja auch Ordner aus. Daraus ein Thumbnail zu machen ist ja etwas unsinnig. Deswegen habe ich mir folgendes[1] ausgedacht um die Ordner zu überspringen:

Code: Alles auswählen

for this_file in os.listdir(input_folder): 
        if os.path.isfile(os.path.join(input_folder, this_file)) == 1:
        ...
        else: 
            print "\n! " + os.path.join(input_folder, this_file) + " is a folder not a file"
Ist das eine übliche Vorgehensweise? Wenn nein wie währt ihr das angegangen?
Da gabs doch auch was von python-forum.de! Gute Codes, gute Besserung... ähhh Diskussion.
Mr_Snede hat geschrieben:Habt ihr sonst noch Anmerkungen vielleicht in Hinblick auf's kommende GUI?
Ja. Bitte keine Qt GUI, die wird dann alle Windows'ler ausschließen (zumindest bis Qt4, aber ob PyQt mitzieht ist unbekannt).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
Mr_Snede
User
Beiträge: 387
Registriert: Sonntag 8. Februar 2004, 16:02
Wohnort: D-Dorf, Bo

Ja. Bitte keine Qt GUI, die wird dann alle Windows'ler ausschließen (zumindest bis Qt4, aber ob PyQt mitzieht ist unbekannt).
Ich werde auch QT ausprobieren (wie alle anderen auch für die ich Bindings via apt-get bekomme ) default wird aber tk.
Da gabs doch auch was von python-forum.de! Gute Codes, gute Besserung... ähhh Diskussion.
Das ist mir nu aber peinlich, da habe ich letztens noch reingeschaut.

cu Sebastian
Antworten