Seite 1 von 1

Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 16:55
von RSMVDL
Kann mir mal jemand sagen warum der feiner Herr ubuntu das hier nicht fressen will ;)

Python Script:

Code: Alles auswählen

__author__ = 'Robin'
import os, random
                                        #Generate_Folder_Key
random.seed()
fk_temp=random.randint(100,100000)
fk=str(fk_temp)
                                        #ISO Path
print("Path to your ISO File: ")
path_input=input()
path_iso=str(path_input)
ISO_PATH = path_iso
                                        #Mount the ISO in your OS
os.system("mkdir /media/tmp_iso"+fk)
os.system("mount -o r,loop %s /media/tmp_iso"+fk % ISO_PATH)



Fehler:

Code: Alles auswählen

Path to your ISO File:
/root/images/ubuntu-12.04.1-server-amd64.iso
Traceback (most recent call last):
  File "repo.py", line 14, in <module>
    os.system("mount -o r,loop %s /media/tmp_iso"+fk % ISO_PATH)
TypeError: not all arguments converted during string formatting

Warum findet der den Ordner nicht, welcher erstellt wurde bzw. mit dem "fk"=FolderKey versehen worden ist!?

Ich bitte um schnelle Hilfe

LG Robin

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 17:03
von /me
RSMVDL hat geschrieben:

Code: Alles auswählen

os.system("mount -o r,loop %s /media/tmp_iso"+fk % ISO_PATH)
Du wendest die Ersetzung auf den String fk an und der hat keine Platzhalter.

Du musst schon den kompletten String verwenden. Allerdings ist das mehr als hässlich.

Code: Alles auswählen

os.system(("mount -o r,loop %s /media/tmp_iso" + fk) % ISO_PATH)
Wenn du ohnehin schon Stringformatierung verwendest, warum verwendest du dann zusätzlich noch mit + eine Stringverkettung? Nimm doch einfach alle variablen Bestandteile in das Template auf.

Code: Alles auswählen

os.system("mount -o r,loop %s /media/tmp_iso%s" % (ISO_PATH, fk))
Alternativ könntest du die bevorzugte Methode format verwenden.

Code: Alles auswählen

os.system("mount -o r,loop {path} /media/tmp_iso{ext}".format(path=ISO_PATH, ext=fk)

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 17:11
von EyDu
Oder man verwendet am besten gleich das subprocess-Modul und os.path.join. Außer natürlich man steht auf interessante Fehler ;-)

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 17:47
von BlackJack
RSMVDL: Der `random.seed()`-Aufruf ist mindestens überflüssig — weg damit.

Es gibt so einige überflüssige Namen. `fk_temp`, `path_input`, und `path_iso` könnte man sich locker sparen. Ebenso den `str()`-Aufruf mit `path_input` — wenn das Python 3.x ist, dann gibt `input()` bereits eine Zeichenkette zurück. Sollte es Python 2.x sein, dann funktioniert das so sowieso nicht, weil `input()` dann vom Benutzer die Eingabe von Python-Quelltext erwartet.

Zum zusammensetzen von Pfaden gibt es wie schon erwähnt wurde `os.path.join()`

Zufällige Dateinamen für temporäre Dateien kann man mit dem `tempfile`-Modul erstellen.

Um Verzeichnisse zu erstellen muss man kein externes Programm bemühen: `osmkdir()`.

Und wie auch schon erwähnt: Externe Programme startet man mit dem `subprocess`-Modul wenn man nicht auf exotische Fehler steht. :-)

Edit: Ungetestet

Code: Alles auswählen

import os
from subprocess import call
from tempfile import mktemp


def main():
    iso_path = input('Path to your ISO file: ')
    mount_point = mktemp(prefix='tmp_iso_', dir='/media')
    os.mkdir(mount_point)
    call(['mount', '-o', 'r,loop', iso_path, mount_point])


if __name__ == '__main__':
    main()

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:30
von RSMVDL
HALT STOP ;)
ZU VIEL INFO...^^
Danke für eure Info okay okay.
Ich hatte ohne hin am Anfang einen Denkfehler (trivial).

Der Spaß sieht jetzt so aus:

Code: Alles auswählen

__author__ = 'Robin'
import os, random, sys, subprocess
                                        #Generate_Folder_Key
random.seed()
fk_temp=random.randint(100,100000)
fk=str(fk_temp)
                                        #Sourcefolder_Path
print("Path to your Source Files: ")
path_input=input()
path_source=str(path_input)
                                        #create temp folder
temp_folder_p0 = os.system("mkdir /media/tmp_source"+fk)
                                        #copy files to temp folder
Ich will quasi den Temporären Ordner namen welchen ich angelegt habe jetzt in eine Variable speichern (Also den gesamten Pfad wo genau der Ordner auf dem FS liegt).
Später will ich alle Dateien aus dem Quell Ordner in den erstellten Temp Ordner reinkopieren
Ihr könnt sicherlich sehen das ich ein krasser Anfänger bin... Also bitte nicht durch Info Überfluss verwirren.
Danke aber im vorraus.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:35
von BlackJack
@RSMVDL: Du willst den Ordernamen *nachdem* Du den Ordner erstellt hast an einen Namen binden? Wie wär's denn wenn Du das *vorher* machen würdest‽ Denn zum anlegen des Ordners brauchst Du den Namen doch auch schon. Nämlich als Argument für `os.mkdir()`. Bitte vergiss das es `os.system()` überhaupt gibt.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:36
von RSMVDL
Okay jetzt sieht es schon mal so aus:

Code: Alles auswählen

__author__ = 'Robin'
import os, random, sys, subprocess

fk_temp=random.randint(100,100000)
fk=str(fk_temp)
                                        #Sourcefolder_Path
print("Path to your Source Files: ")
path_input=input()
path_source=str(path_input)
                                        #create temp folder
os.system("mkdir /media/tmp_source{ext}".format(ext=fk))
                                        #copy files to temp folder
jetzt muss ich nur Wissen wie der gesamte Pfad heißt?
Wie kann ich mir das ausgeben lassen?

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:38
von BlackJack
@RSMVDL: Bitte einen Beitrag vorher lesen. :-) Und Pfade setzt man immer noch mit `os.path.join()` zusammen und nicht mit `str.format()`.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:42
von RSMVDL
Ich bin der blutigste Anfänger überhaupt ;) was sollt Ihr denn alle von mir ;)
Ich will doch nur wissen wie ich den Ordner Erstelle und den eindeutigen Pfad auf dem FS dann wieder in eine Variable speicher.

Hilfe! :(

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:53
von BlackJack
@RSMVDL: Ordner erstellt man mit `os.mkdir()`. Dafür braucht man den Pfad. Vorher. Denn mit dem Pfad muss man diese Funktion aufrufen. Also erstelle den Pfadnamen und binde ihn an einen Namen.

Ein Pfad ist eine Zeichenkette. Nur das man Pfadteile nicht mit ``+`` oder der ``format()``-Methode zusammen setzen sollte, sondern mit der `os.path.join()`-Funktion.

Was willst Du denn jetzt von uns? Mal davon abgesehen, dass ich weiter oben schon mal Quelltext gepostet habe, der das was Du willst, sauber und ordentlich macht. Und der ist auch nicht besonders schwer. Wenn Du den nach Lektüre der Dokumentation zu den verwendeten Funktionen nicht verstehst, dann weiss ich nicht wie man Dir da noch helfen soll. Denn ausser vielleicht die Liste bei `subprocess.call()` ist das alles ziemlich trivial. Auch für Anfänger geeignet.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 18:55
von RSMVDL
Habs jetzt auf die Kette bekommen ;) Endlich.
Danke!

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 19:04
von RSMVDL
Nochmal was anderes wofür steht eigentlich das "name" hier.
Ich nehme mal ganz dumm an das der hier ne Methode aufruft oder?

Code: Alles auswählen

if __name__ == '__main__':

THX

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 19:40
von BlackJack
@RSMVDL: Das vergleicht den Namen `__name__` mit dem Wert '__main__' und führt den Code im ``if``-Block nur aus wenn das wahr ist. Wo siehst Du da einen Methodenaufruf? `__name__` ist genau dann '__main__' wenn das Modul als Programm ausgeführt wurde. Wenn man es per ``import`` importiert, dann ist `__name__` an den Namen des Moduls gebunden. Sinn dahinter ist es, dass man ein Modul sowohl ausführen als auch gefahrlos importieren kann ohne dass das Programm abläuft.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 19:46
von EyDu
Da wird keine Methode aufgerufen, dass ist ein ganz normaler Vergleich. In diesem Fall dient er dazu, dass der in dem if-Block enthaltene Code nur dann ausgeführt wird, wenn der Interpreter mit dieser Datei gestartet wurde. Wenn das Modul von einem anderen importiert wird, dann wird der Code nicht ausgeführt.

Das hat gleich zwei Vorteile: so ist es möglich, dass man ein Modul direkt starten kann. Das ist dann hilfreich, wenn man Tests für das Modul implementiert hat, das Modul an sich schon ein sinnvolles Programm darstellt oder wenn man ein wenig Beispielcode bereitstellt.

Der zweite Vorteil ist, dass man damit auch Programme importieren und wiederverwenden kann. Startet man zum Beispiel die GUI in einem Modul ohne das Idiom, dann kann man es nicht mehr sinnvoll importieren, wenn man nur ein paar Funktionen daraus nutzen möchte. Denn immer wenn man das macht, startet ein vollständigies Programm, obwohl man das nicht möchte.

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Montag 15. April 2013, 23:25
von RSMVDL
äääääh Sorry ich meinte Funktion ;)
Ich bin noch so krass am Anfang von Python aber ich merke langsam ehrlich das die Sprache krass potent ist ;)
Ich bin auf jeden Fall Glücklich hier immer Hilfe zu finden!

Re: Ich bin zu blöd für eine Verkettung

Verfasst: Dienstag 16. April 2013, 08:57
von EyDu
Da ist auch keine Funktion, das ist ein ganz normales if.