Noch ein Python-Code?

Probleme bei der Installation?
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

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
Zuletzt geändert von Strunz_1975 am Samstag 14. Dezember 2019, 19:27, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Benutzeravatar
snafu
User
Beiträge: 6831
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

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...
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Wie kann ich eine Fortschrittsanzeige mit diesem Code programmieren???
Das Script funktioniert :-)

Mfg
Srunz_1975
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Indem Du anfängst, Python zu lernen.
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

hier habe ich ein passendes Programm :-)

https://wiki.ubuntuusers.de/pycp/
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

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()
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Ich bekomme folgende Fehlermeldung:

File "DD.py", line 18
def do(stuff):
^
IndentationError: expected an indented block
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

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()





Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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‽ 🙄
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Weil ich nicht mehr weiter weiss :-(
Benutzeravatar
sparrow
User
Beiträge: 4506
Registriert: Freitag 17. April 2009, 10:28

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.
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Kannst du mir nochmals helfen?
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@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.
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Und was jetzt?
Benutzeravatar
__blackjack__
User
Beiträge: 13925
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Nix. 🤷‍♂️
“Java is a DSL to transform big Xml documents into long exception stack traces.”
— Scott Bellware
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

Ist aber nicht viel :-(
Strunz_1975
User
Beiträge: 36
Registriert: Freitag 13. Dezember 2019, 17:14

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()
Sirius3
User
Beiträge: 18217
Registriert: Sonntag 21. Oktober 2012, 17:20

Schön. Und wann fängst Du an Python zu lernen?
Antworten