Seite 1 von 1

*.* als sys.argv übergeben

Verfasst: Donnerstag 24. April 2008, 23:31
von pycho78
Hi,
ich versuche verzweifelt *.* als sys.argv element zu übergeben, das klappt aber nur wenn ich das in " " stecke, also so: "*.*" , das würde ich gerne vermeiden.

Ich will 3 Elemente übergeben (src, dst und eben z.B. *.*), dabei prüfe ich auch die Anzahl der übergebenen Elemente mit: if not len(sys.argv) == 4, denke da liegt das Problem weil *.* gesplittet wird und somit mehr Elemente entstehen??? Die anderen Elemente ohne Punkt klappen auch wunderbar, nur eben *.* nicht :( was mache ich falsch?

Gruß,
pycho

Verfasst: Donnerstag 24. April 2008, 23:47
von veers
Das *.* wird vermutlich von deiner Shell expandiert - sprich in Dateinamen ungewandelt ;)

Verfasst: Freitag 25. April 2008, 09:44
von lunar
Natürlich hätte man die Argumente auch einfach mal mit einem einfachen ``print sys.argv`` überprüfen können, dann wäre man eventuell von selbst auf die Ursache des Problems gekommen ;)

Verfasst: Freitag 25. April 2008, 10:01
von pycho78
hehe, stimmt eigentlich, aber nicht mehr um die Uhrzeit zu der ich das gestern gepostet habe :)

Verfasst: Freitag 25. April 2008, 13:19
von Leonidas
veers hat geschrieben:Das *.* wird vermutlich von deiner Shell expandiert - sprich in Dateinamen ungewandelt ;)
Hängt von der Shell ab. Unter Linux ist das so, unter Windows müssen die Programme selbst Wildcards expandieren.

Verfasst: Freitag 25. April 2008, 22:41
von pycho78
naja, ich muss das Programm am Ende auf linux und auch auf Windows ausführen können. Ziel ist es nur Dateien (keine Verzeichnisse) aus einem Pfad in eine "Log Struktur" in der Form Y2008/D25/h23/file.txt zu verschieben oder wahlweise kopieren. Mein Programm läuft wie ich will unter Windows (da hatte ich angefangen, unter Linux läuft das so leider nicht, da ich glob.glob(sys.argv[1]) benutzt habe und z.B. *.* übergeben hatte). Muss weitersuchen wie ich es am geschicktesten anstelle. Hat jemand einen Tipp wie ich auf beiden Betriebssystemen alle Files eines Verzeichnisses in ein Array schreiben kann? Aktuell versuche ich es so:

for root, dirs, files in os.walk('/pfad/'):
print files


Bin leider nicht wirklich fit in python bisher... aber das will ich ändern :)
Mein Code der unter win aktuell laeuft sieht so aus:



Code: Alles auswählen

import os
import glob
import time
import sys
import shutil
import os

# define a class for easier coding below ;)
class Timestamp:
        def __init__(self):
                self.filestamp=time.strftime('%Y%m%d%h%m')
                self.dirstamp=time.strftime('%Y%m%d%h%m')
                if os.name =='nt':
                        self.dirsplit='\\'
                elif os.name == 'posix':
                        self.dirsplit='/'
                        print 'Unix like system detected...using "/" for directories'

        def gettime(self):
                #definition of the timestamp used for files YyyyyMmmDddHhhmmm
                self.filestamp='Y'+time.strftime('%Y')+'M'+time.strftime('%m')+'D'\
                +time.strftime('%d')+'h'+time.strftime('%H')+'m'+time.strftime('%M') \
                +'s'+time.strftime('%S')+'_'
                return self.filestamp

        def getdirtime(self):
                #definition of the timestamp used for files YyyyyMmmDddHhhmmm
                self.dirstamp='Y'+time.strftime('%Y')+ self.dirsplit + 'M'+time.strftime('%m')+ self.dirsplit +'D' \
                +time.strftime('%d')
                return self.dirstamp

        def makedir(self):
                        #definition of foldernames with Yyy\Mmm\Ddd structure
                        self.dirstamp=self.dirsplit + 'Y'+ time.strftime('%Y')+ self.dirsplit + 'M'\
                        +time.strftime('%m')+ self.dirsplit + 'D' + time.strftime('%d')
                        return self.dirstamp

f=Timestamp()
logtimestamp=f.gettime()[:-1]
logdirstamp=f.getdirtime()


if len(sys.argv) == 3:
        if not os.path.exists(sys.argv[2] + logdirstamp):
                os.makedirs(sys.argv[2] + logdirstamp)

        try:
                for i in glob.glob(sys.argv[1]):
                     shutil.copy(i, sys.argv[2] + logdirstamp + f.dirsplit)
                     print 'copying ' + i + ' to: ' + logdirstamp + os.path.basename(i)
        except BaseException:
                raise


else:
        print 'usage:\tpython copyfilestohist.py "*.*" "d:\\"'

Verfasst: Freitag 25. April 2008, 23:54
von BlackJack
@pycho78: Die Klasse macht das ganze eher komplizierter als einfacher, da würde *eine* Funktion genügen, die alle drei Ergebnisse liefert. Man sollte auch *eine* Zeit ermitteln und die dann dreimal formatieren, weil die Zeitstempel sonst in ungünstigen Fällen nicht zusammen passen könnten.

Die Attribute `filestamp` und `dirstamp` werden in der `__init__()` berechnet, dann aber nicht verwendet, sondern extrem kompliziert in den beiden `get*()`-Methoden neu berechnet. Das geht jeweils mit *einem* `strftime()`-Aufruf! Der Sinn das die Platzhalter mit einem % eingeleitet werden ist ja, dass man auch noch andere Zeichen in der Zeichenkette unterbringen kann. Für `gettime()` sähe der Aufruf z.B. so aus: ``time.strftime('Y%YM%mD%dh%Hm%Ms%S')``

Pfade kann man mit `os.path.join()` plattformunabhängig zusammen setzen lassen, dass muss man nicht selbst programmieren.

Den `makedirs()`-Aufruf würde ich ohne vorherigen Test machen. Wenn das Zielverzeichnis schon existiert, schadet der Aufruf nicht.

Als Ausnahmebehandlung die Ausnahme einfach nur mit ``raise`` erneut auszulösen kann man sich sparen.

Und in einer Schleife etwas anderes als ganze Zahlen an den Namen `i` zu binden, bringt Dir den Hass von jedem ein, der das Programm irgend wann einmal warten muss.

Verfasst: Samstag 26. April 2008, 09:28
von pycho78
@BlackJack:

Danke für Deine Tipps. Das mit der Klasse war eher einfach mal ein Versuch eine Klasse zu benutzen (hatte ich noch nie gemacht). Ich neige wirklich dazu alles zu verkomplizieren :) liegt aber einfach daran das ich so gut wie keine Erfahrung im Programmieren habe, ich werde mir Deine Ratschläge zu Herzen nehmen und einfach noch einmal von vorne beginnen.

Danke und Gruß,
Pycho