Seite 1 von 1

Datei Öffen und den Inhalt ausführen???

Verfasst: Samstag 26. Januar 2008, 19:24
von Andyh
Hallo

Ich möchte in einer Datei gespeicherte "def" aufrufe ausführen.

Die Datei die geöffnet wird sieht so aus:

test1()
test2()
test3()

Im Programm gibt es dann die drei def´s dazu.

Die Datei öffen ich so:

Code: Alles auswählen

def oeffnen():
    name = raw_input("geben sie den Namen der Datei ein: ")
    datei = file(name, "r")
    global line
    for line in datei.readlines():
        print line
        datei.close
Wenn ich "print line" schreibe kommt der Inhalt also wird die Datei schonmal gelesen, nur wie bekomme ich es hin das erst test1() und dann test2() und dann test3() ausgeführt wird.

Gruß
Andyh

Verfasst: Samstag 26. Januar 2008, 19:39
von Nikolas
Ich würde mal sagen, dass du die Datei nicht lesend öffnest, sondern ein ganz normales import oder reimport (?) machst, also so wie immer, wenn du Definitionen aus einer anderen Datei holst.

Verfasst: Samstag 26. Januar 2008, 19:40
von Craven
Einen String kann man mit exec "ausführen", z.B.:

Code: Alles auswählen

a = [3, 5, 10, 13]
exec "for i in a: print i"
Aber obs das so bringt ...

Verfasst: Samstag 26. Januar 2008, 19:47
von Andyh
Hallo

Das geht ja schnell!

@Nikolas
Kannst du mir das bitte näher erklären?
Ich habe noch nicht viel mit Dateien gearbeitet. Die ganzen Tutorials beschreiben nur wie ich den inhalt ausgebe (mal die wo ich gefunden habe).
ich erwarte keine fertige Lösung (ich will ja sagen könne, hab ich gemacht), ein guter verweis (auf Deutsch)recht ja, oder ein code Schnipsel.

@Craven
Ich habe exec gerade ausprobiert. Wenn die Datei eine Zeile hat dann wird die ausgeführt, bei mehr wie einer wird nur die letzt ausgeführt. Wie kann ich das ändern?

Gruß
Andyh

Verfasst: Samstag 26. Januar 2008, 20:20
von Craven
Ich glaube, execfile wäre hier doch besser, dann kannst du dir das einzelne auslesen sparen, da du ja eh alle ausführen willst.

Das könnte man z.B. so machen:

Code: Alles auswählen

a = "C:\\dokumente und einstellungen\\craven\\desktop\\a.py"
def asd1():
    print "asd1"
def asd2():
    print "asd2"
def asd3():
    print "asd3"
execfile(a) # einfach einen String mit dem Pfad an execfile übergegen
In der Datei a.py stehen, wie bei dir, die Funktionsaufrufe.

Und jetz erklär mir bitte, wozu du das brauchst. ;)

Verfasst: Samstag 26. Januar 2008, 20:27
von gerold
Hallo Andyh!

Wenn du auch nur einen Funken Sicherheit in deiner Anwendung haben möchtest, dann würde ich es nur zulassen, die gegebenen Funktionen auszuführen.

Z.B. so:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-

# Die zugehörige Textdatei (abc.txt) sieht so aus:
# test1
# test3
# test2


def test1():
    print "ich bin test1"


def test2():
    print "ich bin test2"


def test3():
    print "ich bin test3"


def main():
    
    functions = {
        "test1": test1,
        "test2": test2,
        "test3": test3,
    }
    
    filename = "abc.txt"
    my_file = file(filename, "rU")
    for line in my_file:
        line = line.strip()
        if not line:
            continue
        # Ausführen
        functions[line]()
    
    my_file.close()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)

Verfasst: Samstag 26. Januar 2008, 20:34
von Andyh
Hallo

Danke für die super Lösung!
Habe alles mal wieder viel zu kompliziert gemacht :oops:

Für was ich das brauche:
Ich möchte ein Programm in unterschiedlicher Reihenfolge ablaufen lassen(nur zum testen) und um nicht jedes mal das Programm umschreiben zu müssen will ich es gerne über eine Datei machen.

Ich schon getestet und lauft wie ne 1, besten Dank!

EDIT: Gerold, das ist ja eine feine lösung, Danke

Gruß
Andyh

Verfasst: Samstag 26. Januar 2008, 22:10
von Jan-Peer
Hmja, viele Wege führen nach Rom, aber eigentlich würde man es wohl eher so machen:

Code: Alles auswählen

import pythondateimitfunktionen

pythondateimitfunktionen.test2()
pythondateimitfunktionen.test1()
pythondateimitfunktionen.test3()

In eine eigene Python-Datei im selben Verzeichnis packen und dann immer nur diese ausführen.