Seite 1 von 2

Noch ein Python-Code?

Verfasst: Samstag 14. Dezember 2019, 19:19
von Strunz_1975
Hallo,

ich habe noch einen Python-Code, der
ein Backup von einer externen USB-Festplatte in ein lokales
Home-Verzeichnis übertragen soll!

Code: Alles auswählen

#!/usr/bin/env python
import os

FROM = '/media/werner/USB1/'

TO_TMP = '/home/werner/Restore/'

TO_MULTI = TO_TMP + '/multivol_snapshot'
TO_SNAP = TO_TMP + '/snapshot'


def do(stuff):
    print stuff
    os.system(stuff)

def m2s(path):
    assert path.startswith(TO_MULTI), 'It must be a multivol path'
    tmp = path.replace(TO_MULTI, TO_SNAP, 1)
    if tmp.endswith('/'):
        tmp = tmp[:-1]
    return tmp


def main():
    # restore broken dejadup / duplicity fullbackup without manifest
    # Step One
    # untar 
    os.chdir(TO_TMP)
     do("for t in \"" + FROM + "/\"*.difftar; do echo $t; "
        "tar xvfi \"$t\"; done;")
    # Step Two
    # join multipart files
    for (path, dirs, files) in os.walk(TO_MULTI):
        print path
        if len(dirs) == 0:
		# add leading zeros for more than 10 parts
            for f in files:
                os.rename(os.path.join(path, f),os.path.join(path, str(f).zfill(10)))	
            # we need to combine all these elements
            do("cat \"" + path + "\"/* > \"" + m2s(path) + "\"")
            #do("rm *")
        else:
            do("mkdir -p \"" + m2s(path) + "\"")


if __name__ == '__main__':
    main()


Bringt er folgende Fehlermeldung:

tar: Unerwartetes Dateiende im Archiv.
tar: »rmtlseek« nicht an Recordgrenze angehalten
tar: Error is not recoverable: exiting no

Was ist zu tun?

Mfg
Srunz_1975

Re: Noch ein Python-Code?

Verfasst: Samstag 14. Dezember 2019, 19:25
von __blackjack__
@Srunz_1975: Die Frage am Ende ist ganz klar mit *Skript wegwerfen* zu beantworten. Das ist kein Python. Da hat jemand versucht ein Shellskript in Python-Syntax zu prügeln. Erfolglos.

Re: Noch ein Python-Code?

Verfasst: Samstag 14. Dezember 2019, 19:29
von Strunz_1975

Re: Noch ein Python-Code?

Verfasst: Sonntag 15. Dezember 2019, 07:49
von snafu
Deine Thread-Titel lassen auch zu wünschen übrig. Wird es beim nächsten Mal "ein dritter Python-Code" heißen? Orientiere dich dabei besser mal an der (groben) Beschreibung des Problems. Python-Code in einem Python-Forum anzukündigen, ist jetzt nicht sooo besonders...

Re: Noch ein Python-Code?

Verfasst: Freitag 27. Dezember 2019, 18:58
von Strunz_1975
Wie kann ich eine Fortschrittsanzeige mit diesem Code programmieren???
Das Script funktioniert :-)

Mfg
Srunz_1975

Re: Noch ein Python-Code?

Verfasst: Freitag 27. Dezember 2019, 19:20
von Sirius3
Indem Du anfängst, Python zu lernen.

Re: Noch ein Python-Code?

Verfasst: Freitag 27. Dezember 2019, 19:38
von Strunz_1975
hier habe ich ein passendes Programm :-)

https://wiki.ubuntuusers.de/pycp/

Re: Noch ein Python-Code?

Verfasst: Freitag 27. Dezember 2019, 19:43
von Strunz_1975
Oder so:

import time
import progressbar


def job():
bar = progressbar.ProgressBar()
for i in bar(range(100)):
... # Code that you want to run
#time.sleep(0.02)

job()

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 10:52
von Strunz_1975
Ich bekomme folgende Fehlermeldung:

File "DD.py", line 18
def do(stuff):
^
IndentationError: expected an indented block

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 10:57
von Strunz_1975
Hier ist nochmals der Code

Code: Alles auswählen

#!/usr/bin/env python
import os
import time
import progressbar

FROM = '/media/werner/USB2'

TO_TMP = '/home/werner/workspace/Restore'

TO_MULTI = TO_TMP + '/multivol_snapshot'
TO_SNAP = TO_TMP + '/snapshot'


def job():
  bar = progressbar.ProgressBar()
  for i in bar(range(100)):

  def do(stuff):
      print(stuff)
      os.system(stuff)
 
  def m2s(path):
        assert path.startswith(TO_MULTI), 'It must be a multivol path'
        tmp = path.replace(TO_MULTI, TO_SNAP, 1)
            if tmp.endswith('/'):
        tmp = tmp[:-1]
      return tmp


	def main():
    # restore broken dejadup / duplicity fullbackup without manifest
    # Step One
    # untar 
   	 os.chdir(TO_TMP)
   			 do("for t in \"" + FROM + "/\"*.difftar; do echo $t; tar xvfi \"$t\"; done;")
    # Step Two
    # join multipart files
    	for (path, dirs, files) in os.walk(TO_MULTI):
        	print(path)
       			 if len(dirs) == 0:
		# add leading zeros for more than 10 parts
            	for f in files:
               		 os.rename(os.path.join(path, f),os.path.join(path, str(f).zfill(10)))	
                # we need to combine all these elements
                	do("cat \"" + path + "\"/* > \"" + m2s(path) + "\"")
           	 #do("rm *")
       			 else:
          			  do("mkdir -p \"" + m2s(path) + "\"")


		if __name__ == '__main__':
                      main()

time.sleep(0.02)

job()






Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 11:15
von __blackjack__
@Srunz_1975:Jetzt willst Du also ohne Python auch nur ansatzweise zu können ein ”Python”-Programm was eh für die Tonne ist, da nicht wirklich Python, durch raten um eine Fortschrittsanzeige erweitern. In dem Du erst mal den ganzen Modulinhalt, also auch die Funktionen inklusive `main()` und dem ``if __name__ == "__main__":`` in eine `job()`-Funktion verschiebst, plötzlich Leerzeichen und Tabs vermischst und die Einrückung insgesamt auch kaputt gemacht wurde. Warum‽ 🙄

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 11:19
von Strunz_1975
Weil ich nicht mehr weiter weiss :-(

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 11:20
von sparrow
In Python ist die Einrückung des Codes wichtig, weil man damit einen Block kennzeichnet.
Per Konvention rückt man mit 4 Leerzeichen ein (keine Tabstops).
Dein gezeigter Code ist aber Kraut und Rüben, was die Einrückung angeht. Ein Zeichen dafür, dass du Codeteile entweder zusammekopiert oder in verschiedenen Editoroen bearbeitet hast.

Eine Funktionsdefinition in eine Funktion zu basteln ist nur in wenigen Fällen eine gute Idee. Oft ist es ein Zeichen dafür, dass man kaschieren will, dass man globale Variablen nutzt (die dann nicht mehr ganz so global sind) oder ein Objekt repräsentiert wird, das eigentlich eine Klasse sein sollte.

In deinem Fall werde ich aus den Einrückungen aber nicht schlau, die musst du erst einmal reparieren.

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 11:58
von Strunz_1975
Kannst du mir nochmals helfen?

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 12:01
von __blackjack__
@sparrow: Das Original ist ja von hier: https://forum.ubuntuusers.de/topic/kann ... st-8895095
Oder mal kopiert:

Code: Alles auswählen

#!/usr/bin/env python
import os

FROM = '/home/user/von_hier'

TO_TMP = '/home/user/nach_hier'

TO_MULTI = TO_TMP + '/multivol_snapshot'
TO_SNAP = TO_TMP + '/snapshot'


def do(stuff):
    print stuff
    os.system(stuff)

def m2s(path):
    assert path.startswith(TO_MULTI), 'It must be a multivol path'
    tmp = path.replace(TO_MULTI, TO_SNAP, 1)
    if tmp.endswith('/'):
        tmp = tmp[:-1]
    return tmp


def main():
    # restore broken dejadup / duplicity fullbackup without manifest
    # Step One
    # untar 
    # os.chdir(TO_TMP)
    # do("for t in \"" + FROM + "/\"*.difftar; do echo $t; "
    #    "tar xvfi \"$t\"; done;")
    # Step Two
    # join multipart files
    for (path, dirs, files) in os.walk(TO_MULTI):
        print path
        if len(dirs) == 0:
		# add leading zeros for more than 10 parts
            for f in files:
                os.rename(os.path.join(path, f),os.path.join(path, str(f).zfill(10)))	
            # we need to combine all these elements
            do("cat \"" + path + "\"/* > \"" + m2s(path) + "\"")
            #do("rm *")
        else:
            do("mkdir -p \"" + m2s(path) + "\"")


if __name__ == '__main__':
    main()
Das ist also nicht wirklich zusammenkopiert, sondern einfach ”nur” in eine `job()`-Funktion verschoben, plus Zerstörung der Einrückung.

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 12:37
von Strunz_1975
Und was jetzt?

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 12:44
von __blackjack__
Nix. 🤷‍♂️

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 12:45
von Strunz_1975
Ist aber nicht viel :-(

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 13:48
von Strunz_1975
Jetzt habe ich es geändert:

Code: Alles auswählen

#!/usr/bin/env python
import os
import time
import progressbar

FROM = '/media/werner/USB1/'

TO_TMP = '/home/werner/Restore/'

TO_MULTI = TO_TMP + '/multivol_snapshot'
TO_SNAP = TO_TMP + '/snapshot'


def do(stuff):
    print stuff
    os.system(stuff)

def m2s(path):
    assert path.startswith(TO_MULTI), 'It must be a multivol path'
    tmp = path.replace(TO_MULTI, TO_SNAP, 1)
    if tmp.endswith('/'):
        tmp = tmp[:-1]
    return tmp

def job():
    bar = progressbar.ProgressBar()
    for i in bar(range(100)):
    # Code that you want to run
    time.sleep(0.02)
    

def main():
    # restore broken dejadup / duplicity fullbackup without manifest
    # Step One
    # untar 
    os.chdir(TO_TMP)
     do("for t in \"" + FROM + "/\"*.difftar; do echo $t; "
        "tar xvfi \"$t\"; done;")
    # Step Two
    # join multipart files
    for (path, dirs, files) in os.walk(TO_MULTI):
        print path
        if len(dirs) == 0:
		# add leading zeros for more than 10 parts
            for f in files:
                os.rename(os.path.join(path, f),os.path.join(path, str(f).zfill(10)))	
            # we need to combine all these elements
            do("cat \"" + path + "\"/* > \"" + m2s(path) + "\"")
            #do("rm *")
        else:
            do("mkdir -p \"" + m2s(path) + "\"")
if __name__ == '__main__':
    main()

Re: Noch ein Python-Code?

Verfasst: Samstag 28. Dezember 2019, 14:20
von Sirius3
Schön. Und wann fängst Du an Python zu lernen?